SELECT GETDATE()
Возвращает: 2008-09-22 15:24:13.790
Я хочу эту часть даты без части времени: 2008-09-22 00:00:00.000
Как я могу это получить?
Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Подробнее здесь: sql-server-performance.com/articles/dev/datetime_2008_p1.asp x
Не пропустите эта почта, показывающий результаты тестирования производительности различных методов удаления времени.
@ Мартин странно, спасибо, Давай попробуем еще.
Не вводите себя в заблуждение голосами и принятым ответом, взгляните на stackoverflow.com/a/126984/1155650
@Rohit не у всех есть SQL Server 2008 или новее.
@hktegner - это должно вводить в заблуждение тех, у кого есть. Также есть одна версия ниже 2008 (то есть: 2005), где, как и после нее, у нас есть 4 и продолжает расти.
@Rohit Вы ошибочно полагаете, что 2008 - единственная версия, которая волнует людей. (Есть и другие версии в дикой природе.) Голоса говорят сами за себя.
Для будущих читателей: mssqltips.com/sqlservertip/1145/… также полезен для получения правильного формата при использовании convert.


Попробуй это:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Приведенный выше оператор преобразует ваш текущий формат в YYYY/MM/DD, пожалуйста, обратитесь к эта ссылка, чтобы выбрать предпочтительный формат.
Это возвращает мне "2008/09/22"
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) - это формат mm/dd/yyyy.
если вы сортируете на основе необработанного текстового значения (вне БД), то лучше использовать «японский» формат
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
На SQL Server 2008 и выше вы должны CONVERT на сегодняшний день:
SELECT CONVERT(date, getdate())
В более старых версиях вы можете сделать следующее:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
Например
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
дает мне
2008-09-22 00:00:00.000
Плюсы:
varchar <-> datetime не требуетсяlocaleПо предложению Майкл
Используйте этот вариант: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
select getdate()
SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))
SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))
SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))
Выход:
2019-04-19 08:09:35.557
2019-04-19 08:00:00.000
4763-02-17 00:00:00.000
2019-04-19 00:00:00.000
2019-04-19 00:00:00.000
2019-04-01 00:00:00.000
1903-12-03 00:00:00.000
2019-01-01 00:00:00.000
1900-04-30 00:00:00.000
Является ли этот способ лучше или хуже с точки зрения производительности, чем использование других методов преобразования? Или это ничтожно мало?
Мой метод работает быстрее. Он не требует преобразования в varchar и позволяет эффективно вычислять дату.
+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал в течение многих лет). Хороший.
Если это 35%, чем метод CONVERT, вы должны задаться вопросом, насколько быстрее будет встроенное усечение - это должна быть самая распространенная операция, связанная с датой и временем, которую я когда-либо делал - я собираюсь посмотреть на переключение к этому механизму.
Единственный недостаток вашего решения, который я вижу, заключается в том, что если вы не знаете, что оно делает, оно будет немного тупым. Использование метода двойного преобразования делает ваши намерения более очевидными для всех разработчиков кода. Кстати, я не голосовал против вас. Думаю, я тоже начну пользоваться вашим методом. Спасибо @aku
+1 Возможно, вам будет интересно увидеть отредактированный ответ Рикардо С. (поскольку это вики сообщества и фактически неверно, я исправил его). У вас также есть поддержка вашего вопроса.
Также не пропустите эта почта, показывающий результаты тестирования производительности.
@pilavdzice Установка даты и времени на полночь этого дня делает ОТКЛЮЧИТЕ ВРЕМЯ. Какого результата вы ждете? Тип данных datetime не может иметь совсем нет времени. Я думаю, вы путаете хранение данных с пользовательским представлением. Если все, что вам нужно, это способ показать пользователю строку без временной части (не нулей, только пробелы), тогда вам просто нужен Convert(varchar(30), @Date, 101) или что-то подобное. См. Электронная документация по SQL Server • Приведение и преобразование для получения дополнительной информации.
Стоит отметить, что это не распространяется на агрегирование данных за месяц или год. Вы должны изменить условия, чтобы это сработало. SELECT DATEADD (mm, DATEDIFF (mm, 0, @YourDate), 0) расширяется для mm / yy iirc
@aku Есть ли способ получить только Datepart как «2008-09-22», а не "2008-09-22 00: 00: 00.000" без преобразования в VARCHAR. Сейчас использую CONVERT(VARCHAR(10), @dateTime, 101) AS MyDate
@ user1671639 тип данных datetime всегда содержит как дату, так и время, вы не можете разумно хранить одно без другого - если вы не используете SQL Server 2008, и в этом случае есть также отдельные данные `` дата '' и `` время '' типы. Если вы используете CONVERT () таким образом, вам действительно нужна строка для дальнейшего использования, поэтому вы застрянете, делая это так, хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы вырезать дату - или через CAST(... AS DATE) или CONVERT(DATE, ...), которые довольно часто упоминались именно на этой странице.
Я рекомендую изменить ответ на SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0), потому что тогда dd можно заменить на любое другое ключевое слово datepart, чтобы обрезать ваш datetime на произвольном уровне.
выберите приведение (createddate as date) из таблицы, где createdate - ваш столбец datetime
Вы можете использовать функцию CONVERT, чтобы вернуть только дату. См. Ссылку (-ы) ниже:
Манипулирование датой и временем в SQL Server 2000
Синтаксис использования функции преобразования:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
Обновлено: первые два метода по существу одинаковы, и выполнить преобразование в метод varchar.
Все эти методы хороши, но какой из них вы предлагаете использовать?
Обратите внимание, что «правильная» версия двух верхних - select dateadd(dd, datediff(dd, 0, getdate()), 0), потому что dds можно затем заменить на любой из ключевые слова datepart, чтобы вырезать дату в любом выбранном вами сегменте. (Также обратите внимание, что dd - это просто сокращение от day.)
Используя FLOOR () - просто сократите временную часть.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Этот метод не самый быстрый и неявно учит людей тому, что приведение дат к float является точным, а это не так. Пожалуйста, смотрите эта почта для более подробной информации.
DATEADD и DATEDIFF лучше, чем преобразование в varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в основном относятся к стратегиям доступа данные и не всегда выявляют неявные затраты, связанные с временем ЦП, затрачиваемым на выполнение всех частей. Если оба запроса выполняются для таблицы с миллионами строк, время ЦП с использованием DateDiff может быть близко к 1/3 от времени ЦП Convert!
Чтобы просмотреть планы выполнения запросов:
set showplan_text on
GO
И DATEADD, и DATEDIFF выполнят CONVERT_IMPLICIT.
Хотя решение CONVERT проще и легче читается для некоторых, оно работает является медленнее. Нет необходимости возвращаться к datetime (это неявно выполняется сервером). Также нет реальной необходимости в методе DateDiff для DateAdd после этого, поскольку целочисленный результат также будет неявно преобразован обратно в datetime.
ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (varchar, MyDate, 101) FROM DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
ВЫБЕРИТЕ DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
Использование FLOOR () в качестве предложенного @digi имеет производительность, близкую к DateDiff, но не рекомендуется, поскольку приведение типа данных datetime к float и обратно не всегда дает исходное значение.
Помните, ребята: никому не верьте. Посмотрите статистику производительности и проверьте сами!
Будьте осторожны, когда проверяете свои результаты. Выбор большого количества строк для клиента скроет разницу в производительности, поскольку для отправки строк по сети требуется больше времени, чем для выполнения вычислений. Поэтому убедитесь, что работа со всеми строками выполняется сервером, но набор строк не отправляется клиенту.
Некоторые люди, кажется, не понимают, когда оптимизация кеша влияет на запросы. Выполнение двух запросов в одном пакете или в отдельных пакетах не влияет на кеширование. Таким образом, вы можете либо истечь срок действия кеша вручную, либо просто запустить запросы вперед и назад несколько раз. Любая оптимизация для запроса №2 также повлияет на все последующие запросы, поэтому, если хотите, откажитесь от выполнения №1.
Вот полный тестовый сценарий и результаты производительности, который доказывает, что DateDiff значительно быстрее, чем преобразование в varchar.
Рикардо Си, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с dateiff работает для меня немного быстрее.
Отметим, что я выполнил тест 1000 000 раз. Думаю, для реальных сценариев разница в производительности не будет заметна.
Аку, я использовал для этого теста SQL Server 2005 Express. Я работаю над 2000 на работе, и я протестирую его с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.
Аку, те же результаты. Никакой разницы в производительности более десяти миллионов строк.
Утверждения о равной производительности не соответствуют действительности. Конечно же, планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО выполняться путем сравнения использования ЦП, а не изучения планов выполнения.
SQLServer 2008 теперь имеет тип данных «дата», который содержит только дату без компонента времени. Любой, кто использует SQLServer 2008 и более поздних версий, может делать следующее:
SELECT CONVERT(date, GETDATE())
В SQL 2008 также есть тип данных «время», который отвечает на вторую половину вопроса о разделении даты и времени.
К вашему сведению, я протестировал различные методы отсечения времени от дат, и это был самый быстрый метод. Конечно, разница была небольшая, но она была явно быстрее в большом количестве выполнений.
мол про sqlserver 2005 ??
@ Dr.MAF Завершая круг, ответ до 2008 года находится здесь: stackoverflow.com/questions/113045/…
При использовании SQL 2008 и выше:
select cast(getdate() as date)
Сообщение 243, уровень 16, состояние 1, строка 1 Дата типа не является определенным системным типом.
@FredrickGauss: Какой тип, Дата? Какую версию SQL Server вы используете?
Остерегаться! объявить @ date1 datetime = '2015-09-30 20:59: 59.999'; select cast (@ date1 as date) возвращает '2015-10-01'
@abatishchev извините, это должен был быть declare @date1 datetime = '2015-09-30 23:59:59.999';select cast(@date1 as date)
@Nick: это проблема с DateTime. используйте DateTime2, и он отлично работает. sqlfiddle.com/#!6/9eecb7/2833
@Nick, в дополнение к ответу abatishchev, ваш @ date1 действительно 2015-10-01 из-за ограничений DateTime. Попробуй без приведения к Date, даёт 2015-10-01too! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1 => 2015-10-01
Один из этих легко запоминающихся приемов SQL. Как говорит Майк, только с 2008 года, но, если вы где-то найдете базу данных 2005 года и предыдущую, у вас может быть много проблем :)
@NixVerAZ Я считаю, что есть ровно 0 причин для запуска SQL Server 2005 в конце 2016 года. Это чистый идиотизм, не так ли? Хороший признак того, что там что-то ужасно не так.
Мне нравится использование ANSI std «CAST ()» - если переносимость в наши дни является проблемой (или даже достижимой) :). Также рекомендуется, если вы хотите сохранить точность: msdn.microsoft.com/en-us/library/ms187928.aspx
@abatischchev - 1 причина, которая относится к большему количеству экземпляров, чем вы считаете возможным: руководство отказывается утверждать бюджет на обновление антиквариата, пока кому-то удается поддерживать их работу. Даже SQL Server 2000, работающий под Windows 2000, все еще жив. SQL Server 2005 Express: около 50 экземпляров только в моей компании (нет, не в моей, в которой я работаю).
Проблема '2015-09-30 20: 59: 59.999', похоже, больше не относится к Sql Server 2016.
Можно пойти еще дальше со стандартом ANSI, используя SELECT CAST(CURRENT_TIMESTAMP AS DATE) (CURRENT_TIMESTAMP эквивалентен GETDATE()).
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
ЕСЛИ вы хотите использовать CONVERT и получить тот же результат, что и в исходном заданном вопросе, то есть yyyy-mm-dd, тогда используйте CONVERT(varchar(10),[SourceDate as dateTime],121) тот же код, что и предыдущая пара ответов, но код для преобразования в yyyy-mm-dd с тире 121.
Если я смогу залезть на свою мыльницу на секунду, такое форматирование не относится к уровню данных, и вот почему это было невозможно без глупых «трюков» с высокими накладными расходами до появления SQL Server 2008, когда будут представлены фактические типы данных datepart. Выполнение таких преобразований на уровне данных - это огромная трата накладных расходов для вашей СУБД, но, что более важно, как только вы сделаете что-то подобное, вы в основном создадите потерянные данные в памяти, которые, как я полагаю, вы затем вернетесь в программу. Вы не можете вернуть его в другой столбец 3NF + или сравнить его с чем-либо, набранным без возврата, поэтому все, что вы сделали, это добавили точки отказа и удалили реляционную ссылку.
Вы должны ВСЕГДА идти вперед и возвращать свой тип данных dateTime вызывающей программе и на уровне ПРЕЗЕНТАЦИИ внесите необходимые изменения.. Как только вы начнете преобразовывать вещи перед их возвратом вызывающей стороне, вы избавляетесь от всякой надежды на ссылочную целостность из приложения. Это предотвратит операцию UPDATE или DELETE, если вы не выполните какое-либо ручное восстановление, которое снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.
За исключением, скажем, случая, когда вам нужен запрос, который извлекает все записи, соответствующие предоставленному пользователем Дата как часть даты определенного поля времени. Удачи в этом только на уровне представления. (Вам не нужно конвертировать, вы можете использовать арифметику даты, но вы поняли ...)
@ Андрей, какое это имеет значение? Вы говорите WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date); - нет абсолютно никакого смысла вычеркивать время из колонки.
@AaronBertrand Это работает только при условии, что вход @Date имеет нулевую временную часть. Если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что оставление этого для внешнего интерфейса означает, что вам не нужно знать быстрый способ усечения.
@Andrew все, что вам нужно сделать, это сделать входной параметр DATE. Я по-прежнему считаю, что вам никогда не следует применять такое усечение к столбец, даже если это первый инстинкт большинства людей.
@AaronBertrand и который предполагают, что у вас есть контроль над типом данных параметра. Прекрасно в хранимой процедуре, но не в других ситуациях. Почему бы не выполнить приведение, чтобы убедиться, что параметр является нужным вам типом?
@ Андрей снова, все в порядке. Моя точка зрения - ОПЯТЬ ТАКИ - заключается в том, что вам никогда не нужно разыгрывать колонка. Пожалуйста прочти.
Чтобы получить указанный результат, я использую следующую команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Я надеюсь, это полезно.
Я думаю, это сработает в вашем случае:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
Для возврата в формате даты
CAST(OrderDate AS date)
Приведенный выше код будет работать в sql server 2010.
Он вернется, как 12/12/2013
Для SQL Server 2012 используйте приведенный ниже код
CONVERT(VARCHAR(10), OrderDate , 111)
Это возвращает мне дату с нулевым временем, а не только дату
могу ли я узнать, какую версию SQL-сервера вы используете?
@MaheshML возвращает дату и время в MS SQL 2012.
Прекрасно работает в SQL Azure
@MaheshML SQL Server 2010 не существует.
Я ожидаю, что «SQL Server 2010» означает SQL Server 2008 R2 (в 2010 году было вышел)
Если вам нужен результат в виде varchar, вам следует пройти через
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
о котором уже упоминалось выше.
Если вам нужен результат в формате даты и времени, вы должны использовать любой из запросов ниже
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00:00:00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00:00:00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00:00:00.000
Вы можете использовать следующее для части даты и форматирования даты:
DATENAME => Возвращает символьную строку, которая представляет указанную часть указанной даты.
DATEADD => Функция DATEPART() используется для возврата одной части даты / времени, такой как год, месяц, день, час, минута и т. д.
DATEPART => Возвращает целое число, представляющее указанную часть указанной даты.
CONVERT() => Функция CONVERT() - это общая функция, которая преобразует выражение одного типа данных в другой.
В
Функция CONVERT() может использоваться для отображения данных даты / времени в различных форматах.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
почему бы вам не использовать DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?
EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
вы можете изменить последовательность m, d и года, переставив часть '%d-%m-%Y'
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
Это предложение было затронуто другими ответами (более одного раза).
Даже при использовании старого MSSQL Server 7.0 код здесь (любезно предоставленный этим связь) позволил мне получить любой формат даты, который я искал в то время:
PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110)
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6)
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)
Он произвел такой вывод:
1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015 1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
Я предпочитаю следующее, о чем не упоминалось:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Он также не заботится о локальном или двойном преобразовании - хотя каждая 'datepart', вероятно, выполняет математические вычисления. Так что он может быть немного медленнее, чем метод dateiff, но для меня он намного понятнее. Особенно, когда я хочу сгруппировать только по году и месяцу (установите день на 1).
Дата (поле даты и времени) и DATE_FORMAT (дата и время, "% Y-% m-% d") оба возвращают только свидание от даты и времени
В вопросе говорится о SQL Server. Это похоже на MySQL?
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
Я знаю, что это устарело, но я не вижу, чтобы кто-то так это сказал. Насколько я могу судить, это стандарт ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную CURRENT_DATE ANSI.
select {fn current_date()} as today у меня работает.
@brianary - Это хорошо, но это не ANSI SQL.
Это достаточно справедливо, и ваш ответ хорошо переносится, но я полагал, что пока мы работаем с T-SQL, это тоже работает (и показывает, что реализация ANSI CURRENT_DATE была бы тривиальной для MS).
Вы можете просто использовать приведенный ниже код, чтобы получить только часть даты и избежать части времени в SQL:
SELECT SYSDATE TODAY FROM DUAL;
Это не только для Oracle, а не для MS SQL - это даже неправильно. Чтобы получить часть даты только от Oracle, можно использовать TRUNC(SYSDATE)
Хорошо, хотя я немного опоздал :) Вот еще одно решение.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
Результат
2008-09-22 00:00:00.000
И если вы используете SQL Server 2012 и выше, вы можете использовать функцию FORMAT() следующим образом:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
В вашем первом примере все еще есть компонент времени. Вопрос был в том, как это убрать.
Если вы назначаете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Дата:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
Время:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
На SQL Server 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Начиная с SQL SERVER 2012, вы можете сделать это:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
Уже есть несколько ответов и типов форматирования для SQL-сервера. Но большинство методов несколько неоднозначны, и вам будет сложно запомнить числа для типа формата или функций в отношении конкретного формата даты. Поэтому в следующих версиях SQL-сервера есть вариант получше.
FORMAT ( value, format [, culture ] )
Опция культуры очень полезна, так как вы можете указать дату в соответствии с вашими зрителями.
Вы должны помнить d (для маленьких паттернов) и D (для длинных паттернов).
2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)
2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)
Больше примеров в запросе.
DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';
US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------
10/1/2011 01/10/2011 01.10.2011 2011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日
Если вам нужно больше форматов, вы можете перейти по ссылке:
Чтобы пропустить культуру, пользовательские форматы позволяют вам установить свои собственные, например FORMAT (@d, 'yyyyy-MM-dd'), чтобы получить 2011-10-11.
Просто вы можете сделать так:
SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Выводится как:
2008-09-22 00:00:00.000
Или просто сделайте так:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
Результат:
Date Part Only
--------------
2013-07-14
Мой общий подход, чтобы получить дату без временной части ..
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
select convert(getdate() as date)
select CONVERT(datetime,CONVERT(date, getdate()))
Я думаю, вы скопировали 2 оператора выбора, но скопировали второй выбор внутри первого выбора.
Мой стиль
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
select cast(createddate as date) as derivedate from table
createdate - это ваш столбец datetime, это работает для sqlserver
вы можете использовать, как показано ниже, для разных типов вывода только для даты
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- дд / мм / гггг
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)) ------ мм / дд / гггг
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))
Вау, позволь мне посчитать, как ты можешь это сделать. (не каламбур)
Чтобы получить желаемые результаты именно в этом формате:
2008-09-22
Вот несколько вариантов.
SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2 = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'
Итак, я бы посоветовал выбрать тот, который вам удобен, и использовать этот метод повсеместно во всех ваших таблицах.
Все эти параметры возвращают дату в одном и том же формате. Почему у SQL Server такая избыточность?
Понятия не имею, но они знают. Может быть, кто-нибудь умнее меня ответит на этот вопрос.
Надеюсь, это кому-то поможет.
Самый простой способ - использовать:
SELECT DATE(GETDATE())
DATE - не функциональный чувак.
Если вы хотите, чтобы дата показывала 2008-09-22 00:00:00.000
тогда вы можете округлить его, используя
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))
Это покажет дату в формате в вопросе
Просто делать:
SELECT CAST(date_variable AS date)
или с PostgreSQL:
SELECT date_variable::date
Поскольку с момента получения ответов на этот вопрос было внесено много изменений, я хотел предоставить новый способ получить запрошенный результат. Есть два способа проанализировать данные DATETIME. Во-первых, чтобы получить дату, как задается в этом вопросе:
DATEVALUE([TableColumnName])
Во-вторых, чтобы получить время из значения:
TIMEVALUE([TableColumnName])
Пример:
Таблица: Клиенты
Столбец: CreationDate как DateTime
[Покупатели]. [Дата создания]: 07.02.2020, 09:50:00
DATEVALUE([Customers].[CreationDate]) '--> Output: 2/7/2020
TIMEVALUE([Customers].[CreationDate]) '--> Output: 09:50:00
Я надеюсь, что это поможет, поскольку я какое-то время искал и нашел много ответов, как видно из этого вопроса, и ни один из них не сработал. IE CAST и CONVERT.
Удачного кодирования!
Синтаксис:
SELECT CONVERT (data_type(length)),Date, DateFormatCode)
Бывший:
Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]
все коды формата даты о дате:
DateFormatCode Format
1 [MM/DD/YY]
2 [YY.MM.DD]
3 [DD/MM/YY]
4 [DD.MM.YY]
5 [DD-MM-YY]
6 [DD MMM YY]
7 [MMM DD,YY]
10 [MM-DD-YY]
11 [YY/MM/DD]
12 [YYMMDD]
23 [yyyy-mm-dd]
101 [MM/DD/YYYY]
102 [YYYY.MM.DD]
103 [DD/MM/YYYY]
104 [DD/MM/YYYY]
105 [DD/MM/YYYY]
106 [DD MMM YYYY]
107 [MMM DD,YYYY]
110 [MM-DD-YYYY]
111 [YYYY/MM/DD]
112 [YYYYMMDD]
Если вы хотите получить тип данных даты без времени, даже если время 00:00:00, вам не повезло, вы можете получить varchar, но структура - это datetime, и у вас всегда будет время.