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

SELECT GETDATE()

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

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

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

22.09.2008 03:31:33
Если вы хотите получить тип данных даты без времени, даже если время 00:00:00, то вам не повезло, вы можете получить varchar, но структура - это время даты, и у вас всегда будет время.
Quintin Robinson 22.09.2008 03:39:16
Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Более подробная информация здесь: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein 22.09.2008 03:44:18
Не пропустите этот пост, показывающий результаты тестирования производительности различных методов удаления времени.
ErikE 17.08.2012 22:02:17
Не вводите в заблуждение голосами и принятым ответом, посмотрите на stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews 26.11.2013 10:24:55
@ Rohit Вы ошибочно полагаете, что 2008 год - единственная версия, которая волнует людей. (Есть больше версий в дикой природе.) Голоса говорят сами за себя.
hktegner 14.12.2013 18:27:54
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
2477
7.11.2019 15:39:10
+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал годами). Хороший.
Dane 22.09.2008 04:04:41
Единственный недостаток, который я вижу в вашем решении, заключается в том, что, если вы не знаете, что он делает, это немного глупо. Использование метода двойного преобразования делает ваши намерения более очевидными для разработчиков кода. Кстати, я не проголосовал против вас. Я думаю, что я начну использовать ваш метод тоже. Спасибо @aku
Jim Birchall 24.09.2008 08:25:57
@pilavdzice Установка DateTime в полночь этого дня делает Перестань ВРЕМЯ. Какой результат вы ожидаете? Тип datetimeданных не может иметь никакого времени вообще . Я думаю, что вы путаете хранение данных с презентацией пользователя. Если все, что вам нужно, это способ показать пользователю строку, которая не имеет временной части (не нули, просто пробелы), тогда вы просто хотите Convert(varchar(30), @Date, 101)или что-то подобное. См. Электронную документацию по SQL Server • Преобразование и преобразование для получения дополнительной информации.
ErikE 17.08.2012 22:03:11
@ user1671639 тип данных datetime всегда содержит как дату, так и время, вы не можете разумно хранить одно без другого - если только вы не используете SQL Server 2008, в этом случае также существуют отдельные данные «date» и «time» типы. Если вы используете CONVERT () подобным образом, вам действительно нужна строка для последующего использования, поэтому вы застрянете делать это так - хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы обрезать дату - или через CAST(... AS DATE)или CONVERT(DATE, ...), что упоминалось довольно часто на этой самой странице.
Magnus 21.06.2013 15:08:48
Я рекомендую изменить ответ на, SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)потому что тогда его ddможно заменить на любое другое datepartключевое слово, чтобы усечь его datetimeна произвольном уровне.
Michael - Where's Clay Shirky 14.08.2014 16:08:29

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

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

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

50
14.09.2018 11:10:54
Это возвращает «2008/09/22» для меня
eddiegroves 22.09.2008 03:41:19
ВЫБРАТЬ КОНВЕРТ (VARCHAR (10), GETDATE (), 101) - mm/dd/yyyyформат.
Flea 10.07.2013 20:47:39
если вы сортируете по необработанному текстовому значению (вне БД), то лучше использовать «японский» формат
Simon_Weaver 14.09.2013 00:34:57
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
39
31.01.2011 09:45:20

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

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

АКТЕРЫ и КОНВЕРТ

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
21
14.04.2015 11:45:09
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.

10
29.03.2016 22:42:55
Все эти методы хороши, но какой из них вы предлагаете?
eddiegroves 22.09.2008 03:48:48
Обратите внимание , что «правильный» вариант в верхних два это select dateadd(dd, datediff(dd, 0, getdate()), 0), потому что dds может быть выгружен для любого из тех datepartключевых слов , чтобы отсечь дату в любом сегменте вы выбираете. (Также обратите внимание, что ddэто просто аббревиатура day.)
Michael - Where's Clay Shirky 14.08.2014 16:02:18

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
13
22.09.2008 07:38:59
Этот метод не является самым быстрым, и также косвенно учит людей, что точные даты приведения являются точными, а это не так. Пожалуйста, смотрите этот пост для более подробной информации.
ErikE 12.09.2010 23:16:00

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 к float и back не всегда приводит к исходному значению.

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

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

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

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

72
23.05.2017 12:34:53
Рикардо С, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с datediff для меня работает чуть быстрее.
aku 24.09.2008 05:29:37
Просто чтобы отметить, я выполнил тест 1000.000 раз. Для реальных сценариев разница в производительности не будет заметна, я думаю
aku 24.09.2008 05:30:33
Аку, я использовал SQL Server 2005 Express для этого теста. Я работаю в 2000 году на работе, и я протестирую это с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.
Ricardo C 24.09.2008 06:20:38
Аку, те же результаты. Нет разницы в производительности более десяти миллионов строк.
Ricardo C 25.09.2008 03:41:39
Заявления о равных показателях не соответствуют действительности. Конечно планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО быть сделано путем сравнения использования ЦП, а не изучения планов выполнения.
ErikE 12.09.2010 23:01:58

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

SELECT CONVERT(date, GETDATE())
716
18.04.2016 15:03:53
В SQL2008 также существует тип данных time, который отвечает на другую половину вопроса о разделении даты и времени.
misteraidan 25.08.2011 00:01:41
К вашему сведению, я сравнил различные методы отсечения времени от даты, и это был самый быстрый метод. Разумеется, разница была небольшой, но она была явно быстрее при большом количестве казней.
UnhandledExcepSean 3.07.2014 12:48:46
вес про sqlserver 2005 ??
Dr. MAF 19.11.2015 09:10:23
@ Dr.MAF Завершая круг, ответ до 2008 года здесь: stackoverflow.com/questions/113045/…
Frosty840 31.07.2017 07:24:00

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

select cast(getdate() as date)
168
29.03.2016 23:11:59
@FredrickGauss: какой тип, дата? Какую версию SQL Server вы используете?
abatishchev 13.12.2012 20:01:29
Осторожно! объявлять @ date1 datetime = '2015-09-30 20: 59: 59.999'; выберите актерский состав (@ date1 в качестве даты) возвращает '2015-10-01'
Nick 24.09.2015 19:18:42
@ Ник: это проблема с DateTime. используйте DateTime2вместо этого, и он работает нормально. sqlfiddle.com/#!6/9eecb7/2833
abatishchev 25.09.2015 01:33:16
@ Ник, чтобы дополнить ответ Абатищева, твоя @ 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.12.2015 17:07:38
Один из этих легко запоминающихся трюков SQL. Как говорит Майк, только в 2008 году, но, если вы найдете где-то 2005 и предыдущую БД, у вас может быть много проблем :)
NicVerAZ 29.12.2015 17:04:48
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
14
27.01.2017 21:10:23

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

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

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

12
26.07.2012 20:00:30
За исключением, скажем, если вы хотите запрос, который извлекает все записи, соответствующие предоставленной пользователем дате, как часть даты определенного поля времени. Удачи в этом только на уровне презентации. (Вам не нужно конвертировать, вы можете использовать арифметику дат, но вы поняли…)
Andrew Lazarus 14.03.2013 16:42:35
@ Андрей, почему это важно? Вы говорите WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);- нет абсолютно никакой причины убирать время из колонки.
Aaron Bertrand 16.11.2013 05:09:58
@AaronBertrand Это работает только при условии, что вход @Dateимеет нулевую часть времени. В случае, если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что если оставить его для внешнего интерфейса, вам не нужно знать быстрый способ усечения.
Andrew Lazarus 16.11.2013 17:04:15
@ Андрей все, что вам нужно сделать, это сделать входной параметр DATE. Я по-прежнему считаю, что вам никогда не придется применять любое подобное усечение к столбцу , даже если это первый инстинкт большинства людей.
Aaron Bertrand 16.11.2013 20:25:30
@AaronBertrand и это предполагает, что у вас есть контроль над типом данных параметра. Штраф в хранимой процедуре, не так возможно в других ситуациях. Почему бы не приводить, чтобы убедиться, что параметр того типа, который вам нужен и нужен?
Andrew Lazarus 18.11.2013 23:42:06

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

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

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

10
29.03.2016 22:54:44

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
6
27.11.2013 06:44:56

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

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

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)
20
27.08.2014 08:36:04
Это возвращает мне дату с нулевым временем, а не просто дату
Bohemian♦ 5.01.2014 13:09:20
Могу ли я узнать, какую версию сервера SQL вы используете?
Mahesh ML 19.03.2014 07:15:16
@MaheshML возвращает дату и время в MS SQL 2012.
Marek 13.04.2014 15:50:35
Работает как прелесть в SQL Azure
Martín Coll 21.05.2014 15:01:08
@MaheshML Нет такого понятия, как SQL Server 2010.
SvenAelterman 25.09.2017 02:22:54

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

16
7.11.2019 15:48:32

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

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

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

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

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

3
29.03.2014 16:12:51
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
8
6.06.2015 12:27:44

почему вы не используете 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
17.05.2014 05:46:19
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
6
30.03.2016 00:21:57
Это предложение было охвачено другими ответами (более одного раза).
Andriy M 19.11.2014 21:47:27

Даже используя древний 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
27.02.2015 21:16:05

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

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

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

4
29.03.2016 22:52:24

Date (поле даты и времени) и DATE_FORMAT (дата и время, «% Y-% m-% d») возвращают только дату от даты и времени

3
8.07.2015 06:28:44
Вопрос гласит SQL Server. Это похоже на MySQL?
The1nk 17.12.2015 18:31:56
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
3
29.03.2016 22:53:52

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

4
15.01.2016 18:14:06
select {fn current_date()} as todayработает для меня.
brianary 2.12.2019 18:26:31
@brianary - Это хорошо, но это не ANSI SQL.
lit 8.12.2019 17:28:39
Это достаточно справедливо, и ваш ответ хорошо переносим, ​​но я полагал, что пока мы работаем над T-SQL, это тоже работает (и показывает, что реализация ANSI CURRENT_DATE будет тривиальной для MS).
brianary 8.12.2019 18:28:22

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

SELECT SYSDATE TODAY FROM DUAL; 
-1
5.04.2016 21:40:12
Это не только для Oracle, но не для MS SQL - это даже неправильно. Чтобы получить часть даты только от Oracle, можно было бы использоватьTRUNC(SYSDATE)
David Faber 24.03.2018 12:48:50

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

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
13.04.2016 10:46:30
Ваш первый пример все еще имеет компонент времени. Суть вопроса заключалась в том, как это убрать.
Zack 20.04.2016 21:20:47

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
7
3.05.2017 16:05:44

Свидание:

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

Время:

ВЫБРАТЬ КОНВЕРТ (время, GETDATE (), 114)
ВЫБЕРИТЕ CAST (GETDATE () как время)
5
21.05.2016 09:24:33

На SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
4
21.06.2017 06:27:47

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

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

4
20.07.2016 15:58:29