Как вернуть только тип Date из SQL Server DateTime

1779
SELECT GETDATE()

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

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

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

eddiegroves
источник
4
Если вы хотите получить тип данных без времени, даже если время 00:00:00, то вам не повезло, вы можете получить varchar, но структура - это время даты, и у вас всегда будет время.
Квинтин Робинсон,
16
Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Более подробная информация здесь: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Бен Хоффштейн,
7
Не пропустите этот пост, показывающий результаты тестирования производительности различных методов удаления времени.
ErikE
18
Не вводите в заблуждение голосами и принятым ответом, посмотрите на stackoverflow.com/a/126984/1155650
Рохит Випин Мэтьюз
8
@ Rohit Вы ошибочно полагаете, что 2008 год - единственная версия, которая волнует людей. (Есть больше версий в дикой природе.) Голоса говорят сами за себя.
hktegner

Ответы:

2487

На 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
Ака
источник
52
+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал годами). Хороший.
датчанин
8
Единственный недостаток, который я вижу в вашем решении, заключается в том, что, если вы не знаете, что он делает, это немного глупо. Использование метода двойного преобразования делает ваши намерения более очевидными для разработчиков кода. Кстати, я не проголосовал против вас. Я думаю, что я начну использовать ваш метод тоже. Спасибо @aku
Джим
38
@pilavdzice Установка DateTime в полночь этого дня делает Перестань ВРЕМЯ. Какой результат вы ожидаете? Тип datetimeданных не может иметь никакого времени вообще . Я думаю, что вы путаете хранение данных с презентацией пользователя. Если все, что вам нужно, это способ показать пользователю строку, которая не имеет временной части (не нули, просто пробелы), тогда вы просто хотите Convert(varchar(30), @Date, 101)или что-то подобное. См. Электронную документацию по SQL Server • Преобразование и преобразование для получения дополнительной информации.
ErikE
7
@ user1671639 тип данных datetime всегда содержит дату и время, вы не можете разумно хранить одно без другого - если только вы не используете SQL Server 2008, в этом случае также существуют отдельные данные «date» и «time» типы. Если вы используете CONVERT () подобным образом, вам действительно нужна строка для последующего использования, поэтому вы застрянете, делая это таким образом - хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы обрезать дату - или через CAST(... AS DATE)или CONVERT(DATE, ...), что упоминалось довольно часто на этой самой странице.
Магнус
10
Я рекомендую изменить ответ, SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)потому что тогда его ddможно заменить на любое другое datepartключевое слово, чтобы усечь его datetimeна произвольном уровне.
Майкл - Где Клэй Ширки
717

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

SELECT CONVERT(date, GETDATE())
BenR
источник
41
В SQL2008 также существует тип данных time, который отвечает на другую половину вопроса о разделении даты и времени.
misteraidan
8
К вашему сведению, я сравнил различные методы отсечения времени от даты, и это был самый быстрый метод. Разумеется, разница была небольшой, но она была явно быстрее при большом количестве казней.
UnhandledExcepSean
2
вес про sqlserver 2005 ??
Доктор MAF
@ Dr.MAF Завершая круг, ответ до 2008 года здесь: stackoverflow.com/questions/113045/…
Frosty840
170

Если используется SQL 2008 и выше:

select cast(getdate() as date)
abatishchev
источник
3
@FredrickGauss: какой тип, дата? Какую версию SQL Server вы используете?
Абатищев
7
Осторожно! объявлять @ date1 datetime = '2015-09-30 20: 59: 59.999'; выбор актера (@ date1 как дата) возвращает '2015-10-01'
Ник
6
@Nick: это проблема с DateTime. используйте DateTime2вместо этого, и он работает нормально. sqlfiddle.com/#!6/9eecb7/2833
абатищев
8
@ Ник, чтобы дополнить ответ Абатищева, твоя @ date1 действительно 2015-10-01, из-за DateTimeограничений. Попробуйте без какого-либо броска Date, это 2015-10-01тоже дает ! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Фредерик
4
Один из этих легко запоминающихся трюков SQL. Как говорит Майк, только в 2008 году, но, если вы найдете где-то 2005 и предыдущую БД, у вас может быть много проблем :)
NicVerAZ
73

DATEADD и DATEDIFF лучше, чем преобразование в varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в основном касаются стратегий доступа к данным и не всегда показывают неявные затраты, связанные с затратами времени ЦП на выполнение всех этапов. Если оба запроса выполняются к таблице с миллионами строк, время ЦП с использованием DateDiff может быть близко к 1/3 времени преобразования ЦП!

Чтобы увидеть планы выполнения запросов:

set showplan_text on
GO 

И DATEADD, и DATEDIFF будут выполнять CONVERT_IMPLICIT.

Хотя решение CONVERT проще и легче читать для некоторых, это является более медленным. Нет необходимости приводить обратно к datetime (это неявно делается сервером). Также нет реальной необходимости в методе DateDiff для DateAdd, поскольку целочисленный результат также будет неявно преобразован обратно в datetime.


ВЫБЕРИТЕ КОНВЕРТ (varchar, MyDate, 101) ИЗ 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 к плавающей и обратно не всегда приводит к исходному значению.

Помните, ребята: не верьте никому. Посмотрите статистику производительности и проверьте сами!

Будьте осторожны при тестировании своих результатов. Выбор множества строк для клиента позволит скрыть разницу в производительности, поскольку для отправки строк по сети требуется больше времени, чем для выполнения вычислений. Поэтому убедитесь, что работа для всех строк выполняется сервером, но нет набора строк, отправленного клиенту.

У некоторых людей возникает путаница, когда оптимизация кэша влияет на запросы. Выполнение двух запросов в одном пакете или в разных пакетах не влияет на кэширование. Таким образом, вы можете либо завершить кеш вручную, либо просто выполнять запросы туда-сюда несколько раз. Любая оптимизация для запроса № 2 также повлияет на любые последующие запросы, поэтому, если хотите, исключите выполнение # 1.

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

Ricardo C
источник
Рикардо С, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с datediff для меня работает чуть быстрее.
Ака
Просто чтобы отметить, я выполнил тест 1000.000 раз. Для реальных сценариев разница в производительности не будет заметна, я думаю
aku
Аку, я использовал SQL Server 2005 Express для этого теста. Я работаю в 2000 году на работе, и я протестирую ее с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.
Рикардо С
Аку, те же результаты. Нет разницы в производительности более десяти миллионов строк.
Рикардо С
5
Заявления о равных показателях не соответствуют действительности. Конечно планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО быть сделано путем сравнения использования ЦП, а не изучения планов выполнения.
ErikE
51

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

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

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

Nescio
источник
5
Это возвращает «2008/09/22» для меня
eddiegroves
1
ВЫБРАТЬ КОНВЕРТ (VARCHAR (10), GETDATE (), 101) - mm/dd/yyyyформат.
Блоха
4
если вы сортируете по необработанному текстовому значению (вне БД), то лучше использовать «японский» формат
Simon_Weaver
40
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Кейд Ру
источник
21

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

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

Приведенный выше код будет работать в SQL Server 2010

Он вернется, как 12.12.2013

Для SQL Server 2012 используйте следующий код

CONVERT(VARCHAR(10), OrderDate , 111)
Махеш М.Л.
источник
1
Это возвращает мне дату с нулевым временем, а не просто дату
Богемский
1
Могу ли я узнать, какую версию сервера sql вы используете?
Махеш М.Л.
1
@MaheshML возвращает дату и время в MS SQL 2012.
Marek
1
Работает как прелесть в SQL Azure
Мартин Колл
5
@MaheshML Нет такого понятия, как SQL Server 2010.
SvenAelterman,
16

Если вам нужен результат как 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 

    2014-03-26 00: 00: 00.000

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

    2014-03-26 00: 00: 00.000

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

    2014-03-26 00: 00: 00.000

Стефон Джонс
источник
14
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
Rushda
источник
13

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DiGi
источник
4
Этот метод не является самым быстрым, и также косвенно учит людей, что точные даты приведения являются точными, а это не так. Пожалуйста, смотрите этот пост для более подробной информации.
ErikE
13

Если вы используете 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. «Д» - длинный шаблон даты.

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        2011101

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

  1. Стандартные строки формата даты и времени
  2. Пользовательские строки формата даты и времени
Сомнат Мулук
источник
12

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

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

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

Focusyn
источник
1
За исключением, скажем, если вы хотите запрос, который извлекает все записи, соответствующие предоставленной пользователем дате, как часть даты определенного поля времени. Удачи, делая это только на уровне представления. (Вам не нужно конвертировать, вы можете использовать арифметику дат, но вы поняли ...)
Эндрю Лазарь
1
@ Андрей, почему это важно? Вы говорите WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- нет абсолютно никакой причины убирать время из колонки.
Аарон Бертран
1
@AaronBertrand Это работает только при условии, что вход @Dateимеет нулевую часть времени. В случае, если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что если оставить его для внешнего интерфейса, вам не нужно знать быстрый способ усечения.
Андрей Лазарь
1
@ Андрей все, что вам нужно сделать, это сделать входной параметр DATE. Я по-прежнему считаю, что вам никогда не придется применять любое подобное усечение к столбцу , даже если это первый инстинкт большинства людей.
Аарон Бертран,
1
@AaronBertrand и это предполагает, что у вас есть контроль над типом данных параметра. Штраф в хранимой процедуре, не так возможно в других ситуациях. Почему бы не приводить, чтобы убедиться, что параметр того типа, который вам нужен и нужен?
Андрей Лазарь
10
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.

Гордон Белл
источник
1
Все эти методы хороши, но какой из них вы предлагаете?
Eddiegroves
3
Обратите внимание , что «правильный» вариант в верхних два это select dateadd(dd, datediff(dd, 0, getdate()), 0), потому что dds может быть выгружен для любого из тех datepartключевых слов , чтобы отсечь дату в любом сегменте вы выбираете. (Также обратите внимание, что ddэто просто аббревиатура для day.)
Майкл - Где Клэй Ширки
10

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

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

Я Holpe это полезно.

Андерсон Сильва
источник
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
Анкит Хетан
источник
7

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
Арт Шмидт
источник
6

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
бишну карки
источник
6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
etni
источник
2
Это предложение было охвачено другими ответами (более одного раза).
Андрей М
6

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

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')
Кришнрадж Рана
источник
Ваш первый пример все еще имеет компонент времени. Суть вопроса заключалась в том, как это убрать.
Зак
5

Даже используя древний 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
tumultous_rooster
источник
5

Свидание:

ВЫБРАТЬ КОНВЕРТ (дата, GETDATE ())
ВЫБЕРИТЕ CAST (GETDATE () в качестве даты)

Время:

ВЫБРАТЬ КОНВЕРТ (время, GETDATE (), 114)
ВЫБЕРИТЕ CAST (GETDATE () как время)
Крис Хайралла
источник
5

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

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
Амар Шривастава
источник
4

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

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

освещенный
источник
select {fn current_date()} as todayработает для меня.
brianary
@brianary - Это хорошо, но это не ANSI SQL.
горит
Это достаточно справедливо, и ваш ответ хорошо переносим, ​​но я подумал, что пока мы работаем над T-SQL, это тоже работает (и показывает, что реализация ANSI CURRENT_DATE будет тривиальной для MS).
brianary
4

Я поддерживаю следующее, которое не было упомянуто:

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

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

Жерар ОНЕЙЛ
источник
4

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

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

Xbb
источник
4

На SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
kaub0st3r
источник
4

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

ВЫБЕРИТЕ КОНВЕРТ (VARCHAR (10), getdate (), 111);введите описание изображения здесь

Мухаммед Неамул Ислам
источник
Это должен быть принятый ответ.
Нообпрограммист
3

Вы можете использовать следующие для части даты и форматирования даты:

DATENAME => Возвращает символьную строку, которая представляет указанную часть даты указанной даты

DATEADD => DATEPART()Функция используется для возврата одной части даты / времени, такой как год, месяц, день, час, минута и т. Д.

DATEPART => Возвращает целое число, которое представляет указанную часть даты указанной даты.

CONVERT()=> CONVERT()Функция - это общая функция, которая преобразует выражение одного типа данных в другой. Эта CONVERT()функция может использоваться для отображения даты / времени в разных форматах.

user1151326
источник