SELECT GETDATE()

Возврат: 2008-09-22 15:24:13.790

Я хочу эту часть даты без части времени: 2008-09-22 00:00:00.000

Как я могу это получить?

1992
eddiegroves 22 Сен 2008 в 07:31
17
Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Дополнительная информация здесь: sql-server-performance.com/articles/dev/ datetime_2008_p1.aspx
 – 
Ben Hoffstein
22 Сен 2008 в 07:44
7
Не пропустите этот пост, в котором показаны результаты тестирования производительности различных методов удаления времени.
 – 
ErikE
18 Авг 2012 в 02:02
2
Странно, спасибо, попробуем еще раз.
 – 
Aaron Bertrand
18 Ноя 2013 в 01:13
18
Не вводите в заблуждение голосованием и принятым ответом. Взгляните на stackoverflow.com/a/126984/1155650
 – 
Rohit Vipin Mathews
26 Ноя 2013 в 14:24
8
Вы ошибочно полагаете, что 2008 - единственная версия, которая интересует людей. (Есть и другие версии в дикой природе.) Голоса говорят сами за себя.
 – 
hktegner
14 Дек 2013 в 22:27

30 ответов

Лучший ответ

Начиная с 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
2659
Michael 7 Ноя 2019 в 18:39
56
+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал в течение многих лет). Хороший.
 – 
Dane
22 Сен 2008 в 08:04
8
Единственный недостаток вашего решения, который я вижу, заключается в том, что если вы не знаете, что оно делает, оно будет немного тупым. Использование метода двойного преобразования делает ваши намерения более очевидными для всех разработчиков кода. Кстати, я не голосовал против вас. Думаю, я тоже начну пользоваться вашим методом. Спасибо @aku
 – 
Jim Birchall
24 Сен 2008 в 12:25
39
Установка даты и времени на полночь этого дня действительно ВЫКЛЮЧАЕТ ВРЕМЯ. Какого результата вы ждете? Тип данных datetime не может иметь никакого времени вообще . Я думаю, вы путаете хранение данных с пользовательским представлением. Если все, что вам нужно, это способ показать пользователю строку без временной части (не нулей, только пробелы), тогда вам просто нужно Convert(varchar(30), @Date, 101) или что-то подобное. См. Электронную документацию по SQL Server • Cast and Convert < / a> для получения дополнительной информации.
 – 
ErikE
18 Авг 2012 в 02:03
7
Тип данных datetime всегда содержит как дату, так и время, вы не можете разумно хранить одно без другого - если вы не используете SQL Server 2008, и в этом случае также существуют отдельные типы данных «дата» и «время». Если вы используете CONVERT () таким образом, вам действительно нужна строка для последующего использования, поэтому вы застрянете, делая это так, хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы вырезать дату - или через CAST(... AS DATE) или CONVERT(DATE, ...), которые довольно часто упоминаются именно на этой странице.
 – 
Magnus
21 Июн 2013 в 19:08
10
 – 
Michael
14 Авг 2014 в 20:08

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.

78
10 revs, 5 users 74% 23 Май 2017 в 15:34
Рикардо Си, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с dateiff работает для меня немного быстрее.
 – 
aku
24 Сен 2008 в 09:29
Отметим, что я выполнил тест 1000 000 раз. Думаю, для реальных сценариев разница в производительности не будет заметна.
 – 
aku
24 Сен 2008 в 09:30
Аку, я использовал для этого теста SQL Server 2005 Express. Я работаю над 2000 на работе, и я протестирую его с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.
 – 
Ricardo C
24 Сен 2008 в 10:20
Аку, те же результаты. Никакой разницы в производительности более десяти миллионов строк.
 – 
Ricardo C
25 Сен 2008 в 07:41
5
Утверждения о равной производительности не соответствуют действительности. Конечно, планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО выполняться путем сравнения использования ЦП, а не изучения планов выполнения.
 – 
ErikE
13 Сен 2010 в 03:01
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
42
abatishchev 31 Янв 2011 в 12:45

Для возврата в формате даты

CAST (Дата заказа как дата)

Приведенный выше код будет работать в sql server 2010.

Он вернется, как 12/12/2013

Для SQL Server 2012 используйте приведенный ниже код

CONVERT(VARCHAR(10), OrderDate , 111)
24
Mahesh ML 27 Авг 2014 в 12:36
1
Это возвращает мне дату с нулевым временем, а не только дату
 – 
Bohemian♦
5 Янв 2014 в 17:09
1
Могу ли я узнать, какую версию SQL-сервера вы используете?
 – 
Mahesh ML
19 Мар 2014 в 11:15
1
Он возвращает дату и время в MS SQL 2012.
 – 
Marek
13 Апр 2014 в 19:50
1
Прекрасно работает в SQL Azure
 – 
Martín Coll
21 Май 2014 в 19:01
5
SQL Server 2010 не существует.
 – 
SvenAelterman
25 Сен 2017 в 05:22

Вы можете использовать функцию CONVERT, чтобы вернуть только дату. См. Ссылку (-ы) ниже:

Манипулирование датой и временем в SQL Server 2000

ПРИМЕНЕНИЕ и ПРЕОБРАЗОВАНИЕ

Синтаксис использования функции преобразования:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
23
ughai 14 Апр 2015 в 14:45

Если вам нужен результат в виде varchar, вы должны пройти

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

О котором уже упоминалось выше.

Если вам нужен результат в формате даты и времени, вы должны использовать любой из запросов ниже

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 
    

    26 марта 2014 г., 00:00: 00,000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 
    

    26 марта 2014 г., 00:00: 00,000

  3. DECLARE  @OnlyDate DATETIME
    SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
    SELECT @OnlyDate AS OnlyDate
    

    26 марта 2014 г., 00:00: 00,000

19
Michael 7 Ноя 2019 в 18:48

Если вы используете SQL Server 2012 или более позднюю версию ,

Используйте функцию Format().

Уже есть несколько ответов и типов форматирования для SQL-сервера. Но большинство методов несколько неоднозначны, и вам будет сложно запомнить числа для типа формата или функций в отношении конкретного формата даты. Поэтому в следующих версиях SQL-сервера есть вариант получше.

FORMAT ( value, format [, culture ] )

Опция культуры очень полезна, так как вы можете указать дату в соответствии с вашими зрителями.

Вы должны помнить d (для маленьких паттернов) и D (для длинных паттернов).

1. "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)

2. «D» - шаблон длинной даты.

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日

Если вам нужно больше форматов, вы можете перейти по ссылке:

  1. Стандартные строки формата даты и времени
  2. Пользовательские строки формата даты и времени
18
Somnath Muluk 20 Сен 2016 в 08:26
Чтобы пропустить культуру, пользовательские форматы позволяют вам установить свои собственные, например FORMAT (@d, 'yyyyy-MM-dd'), чтобы получить 11.10.2011.
 – 
ourmandave
7 Янв 2021 в 16:43
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
16
MDM 28 Янв 2017 в 00:10

Используя FLOOR () - просто сократите временную часть.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
15
DiGi 22 Сен 2008 в 11:38
4
Этот метод не самый быстрый и неявно учит людей тому, что приведение дат к float является точным, а это не так. См. этот пост для получения более подробной информации.
 – 
ErikE
13 Сен 2010 в 03:16

ЕСЛИ вы хотите использовать CONVERT и получить тот же результат, что и в исходном заданном вопросе, то есть yyyy-mm-dd, тогда используйте CONVERT(varchar(10),[SourceDate as dateTime],121) тот же код, что и предыдущая пара ответов, но код для преобразования в yyyy-mm -dd с тире - 121.

Если я могу на секунду залезть в свою мыльницу, такого рода форматирование не относится к уровню данных , и поэтому это было невозможно без глупого высокого - накладные расходы до появления в SQL Server 2008 фактических типов данных datepart. Выполнение таких преобразований на уровне данных - это огромная трата накладных расходов для вашей СУБД, но, что более важно, как только вы делаете что-то подобное, вы в основном создаете потерянные данные в памяти, которые, как я предполагаю, вы затем вернетесь в программу. Вы не можете вернуть его в другой столбец 3NF + или сравнить его с чем-либо, набранным без возврата, поэтому все, что вы сделали, это добавили точки отказа и удалили реляционную ссылку.

Вы должны ВСЕГДА возвращать свой тип данных dateTime в вызывающую программу и на уровне PRESENTATION вносить все необходимые изменения. Как только вы приступите к преобразованию, перед возвратом их вызывающему абоненту, вы лишаете приложение всякой надежды на ссылочную целостность. Это предотвратит операцию UPDATE или DELETE, если вы не выполните какое-либо ручное восстановление, которое снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.

13
Focusyn 27 Июл 2012 в 00:00
1
За исключением, скажем, случая, когда вам нужен запрос , который извлекает все записи, соответствующие заданной пользователем дате в качестве части даты в определенном поле времени. Удачи в этом только на уровне представления. (Вам не нужно конвертировать, вы можете использовать арифметику даты, но вы поняли ...)
 – 
Andrew Lazarus
14 Мар 2013 в 20:42
1
Почему это имеет значение? Вы говорите WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date); - нет абсолютно никаких причин вычеркивать время из столбца.
 – 
Aaron Bertrand
16 Ноя 2013 в 09:09
1
Это работает только при условии, что вход @Date имеет нулевую временную часть. Если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что оставление этого для внешнего интерфейса означает, что вам не нужно знать быстрый способ усечения.
 – 
Andrew Lazarus
16 Ноя 2013 в 21:04
1
Все, что вам нужно сделать, это сделать входной параметр ДАТА. Я по-прежнему считаю, что вам никогда не следует применять такое усечение к столбцу , даже если это первый инстинкт большинства людей.
 – 
Aaron Bertrand
17 Ноя 2013 в 00:25
1
И это предполагает, что вы контролируете тип данных параметра. Прекрасно в хранимой процедуре, но не в других ситуациях. Почему бы не выполнить приведение, чтобы убедиться, что параметр является нужным вам типом?
 – 
Andrew Lazarus
19 Ноя 2013 в 03:42

Попробуй это:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

Приведенный выше оператор преобразует ваш текущий формат в YYYY/MM/DD, см. эту ссылку , чтобы выбрать предпочтительный формат.

55
Vladimir Vagaytsev 14 Сен 2018 в 14:10
5
Это возвращает мне "2008/09/22"
 – 
eddiegroves
22 Сен 2008 в 07:41
1
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) - это формат mm/dd/yyyy.
 – 
Flea
11 Июл 2013 в 00:47
4
Если вы сортируете на основе необработанного текстового значения (вне БД), то лучше использовать «японский» формат
 – 
Simon_Weaver
14 Сен 2013 в 04:34

SQLServer 2008 теперь имеет тип данных «дата», который содержит только дату без компонента времени. Любой, кто использует SQLServer 2008 и более поздних версий, может делать следующее:

SELECT CONVERT(date, GETDATE())
742
BenR 18 Апр 2016 в 18:03
44
В SQL2008 также есть тип данных «время», который отвечает на вторую половину вопроса о разделении даты и времени.
 – 
misteraidan
25 Авг 2011 в 04:01
8
К вашему сведению, я протестировал различные методы отсечения времени от дат, и это был самый быстрый метод. Конечно, разница была небольшая, но она была явно быстрее в большом количестве выполнений.
 – 
UnhandledExcepSean
3 Июл 2014 в 16:48
2
Мол про sqlserver 2005 ??
 – 
Dr. MAF
19 Ноя 2015 в 12:10
@ Dr.MAF Завершая круг, ответ до 2008 года находится здесь: stackoverflow.com/questions/113045/…
 – 
Frosty840
31 Июл 2017 в 10:24

При использовании SQL 2008 и выше:

select cast(getdate() as date)
182
abatishchev 30 Мар 2016 в 02:11
3
@FredrickGauss: Какой тип, Дата? Какую версию SQL Server вы используете?
 – 
abatishchev
14 Дек 2012 в 00:01
8
Остерегаться! объявить @ date1 datetime = '2015-09-30 20:59: 59.999'; select cast (@ date1 as date) возвращает '2015-10-01'
 – 
Nick
24 Сен 2015 в 22:18
6
@Nick: это проблема с DateTime. используйте вместо него DateTime2, и он отлично работает. sqlfiddle.com/#!6/9eecb7/2833
 – 
abatishchev
25 Сен 2015 в 04:33
8
@Nick, в дополнение к ответу abatishchev, ваш @ date1 действительно 2015-10-01 из-за ограничений DateTime. Попробуйте без преобразования в Date, это тоже дает 2015-10-01! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1 => 2015-10-01
 – 
Frédéric
11 Дек 2015 в 20:07
4
Один из этих легко запоминающихся приемов SQL. Как говорит Майк, только с 2008 года, но, если вы где-то найдете базу данных 2005 года и предыдущую, у вас может быть много проблем :)
 – 
NicVerAZ
29 Дек 2015 в 20:04
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.

11
chancrovsky 30 Мар 2016 в 01:42
1
Все эти методы хороши, но какой из них вы предлагаете использовать?
 – 
eddiegroves
22 Сен 2008 в 07:48
3
Обратите внимание, что "правильная" версия двух верхних - select dateadd(dd, datediff(dd, 0, getdate()), 0), потому что dd могут быть заменены на любой из datepart ключевые слова для обрезки даты в любом выбранном вами сегменте. (Также обратите внимание, что dd - это просто сокращение от day.)
 – 
Michael
14 Авг 2014 в 20:02

Чтобы получить указанный результат, я использую следующую команду.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Я надеюсь, это полезно.

11
chancrovsky 30 Мар 2016 в 01:54
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
8
Imran Ali Khan 6 Июн 2015 в 15:27

Если вы назначаете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
8
Art Schmidt 3 Май 2017 в 19:05

Я думаю, это сработает в вашем случае:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
6
Radim Köhler 27 Ноя 2013 в 10:44
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
6
chancrovsky 30 Мар 2016 в 03:21
2
Это предложение было затронуто другими ответами (более одного раза).
 – 
Andriy M
20 Ноя 2014 в 00:47

Хорошо, хотя я немного опоздал :) Вот еще одно решение.

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')
6
Krishnraj Rana 13 Апр 2016 в 13:46
В вашем первом примере все еще есть компонент времени. Вопрос в том, как это убрать.
 – 
Zack
21 Апр 2016 в 00:20

Свидание:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

Время:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)
6
Kris Khairallah 21 Май 2016 в 12:24

Даже при использовании старого 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
5
tumultous_rooster 28 Фев 2015 в 00:16

Просто вы можете сделать так:

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
5
Eric Aya 8 Сен 2017 в 12:01

Почему бы вам не использовать 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' часть

4
Janaka R Rajapaksha 17 Май 2014 в 09:46

Я знаю, что это устарело, но я не вижу, чтобы кто-то так это сказал. Насколько я могу судить, это стандарт ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную CURRENT_DATE ANSI.

4
lit 15 Янв 2016 в 21:14
select {fn current_date()} as today у меня работает.
 – 
brianary
2 Дек 2019 в 21:26
- Хорошо, но это не ANSI SQL.
 – 
lit
8 Дек 2019 в 20:28
Это достаточно справедливо, и ваш ответ хорошо переносится, но я полагал, что пока мы работаем с T-SQL, это также работает (и показывает, что реализация ANSI CURRENT_DATE была бы тривиальной для MS).
 – 
brianary
8 Дек 2019 в 21:28

Я предпочитаю следующее, о чем не упоминалось:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Он также не заботится о локальном или двойном преобразовании - хотя каждая 'datepart', вероятно, выполняет математические вычисления. Так что он может быть немного медленнее, чем метод dateiff, но для меня он намного понятнее. Особенно, когда я хочу сгруппировать только по году и месяцу (установите день на 1).

4
chancrovsky 30 Мар 2016 в 01:52

Начиная с SQL SERVER 2012, вы можете сделать это:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

4
xbb 20 Июл 2016 в 18:58

На SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
4
Jonathan Leffler 21 Июн 2017 в 09:27

В этом случае, только дата, мы запустим этот запрос:

SELECT CONVERT (VARCHAR (10), getdate (), 111); введите описание изображения  здесь

7
Mohammad Neamul Islam 24 Ноя 2019 в 11:00

Просто сделать:

SELECT CAST(date_variable AS date)

Или с PostgreSQL:

SELECT date_variable::date

5
John Sonnino 22 Янв 2020 в 19:54