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

SELECT GETDATE()

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

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

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

 Ben Hoffstein22 сент. 2008 г., 05:44
Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Больше информации здесь:sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
 Rohit Vipin Mathews26 нояб. 2013 г., 11:24
Не вводите в заблуждение голосами и не принимайте ответ, посмотрите наstackoverflow.com/a/126984/1155650
 hktegner14 дек. 2013 г., 19:27
@ Rohit Вы ошибочно полагаете, что 2008 год - единственная версия, которая волнует людей. (Есть больше версий в дикой природе.) Голоса говорят сами за себя.
 ErikE18 авг. 2012 г., 00:02
Не пропуститеthis post показывая результаты тестирования производительности различных методов удаления времени.
 Quintin Robinson22 сент. 2008 г., 05:39
Если вы хотите получить тип данных без времени, даже если время 00:00:00, то вам не повезло, вы можете получить varchar, но структура - это время даты, и у вас всегда будет время.

Ответы на вопрос(28)

На SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
 19 нояб. 2014 г., 22:17
Пожалуйста, объясните, что происходит в вашем ответе.
 19 нояб. 2014 г., 22:47
Это предложение было охвачено другими ответами (более одного раза).

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
 06 дек. 2010 г., 23:09
Ошибки квантования с плавающей точкой страшны
 13 сент. 2010 г., 01:16
Этот метод не является самым быстрым, и также косвенно учит людей, что точные даты приведения являются точными, а это не так. Посмотри пожалуйстаthis post для более подробной информации.

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Result

2008-09-22 00:00:00.000

И если вы используете SQL Server 2012 и выше, то вы можете использоватьFORMAT() функция как это -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
 20 апр. 2016 г., 23:20
Ваш первый пример все еще имеет компонент времени. Суть вопроса заключалась в том, как это убрать.

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

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

SELECT CONVERT(date, GETDATE())
 19 нояб. 2015 г., 10:10
вес про sqlserver 2005 ??
 25 авг. 2011 г., 02:01
Существует также «время». тип данных в SQL2008, который отвечает на другую половину вопроса о разделении даты и времени.
 31 июл. 2017 г., 09:24
@ Dr.MAF Завершая круг, ответ до 2008 года здесь:stackoverflow.com/questions/113045/…
 03 июл. 2014 г., 14:48
К вашему сведению, я сравнил различные методы отсечения времени от даты, и это был самый быстрый метод. Разумеется, разница была небольшой, но она была явно быстрее при большом количестве казней.

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

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

If you are using SQL Server 2012 or above versions,

использованиеFormat() функция.

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

FORMAT ( value, format [, culture ] )

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

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

1."d" - Short date pattern.
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" - Long date pattern.
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日

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

Standard Date and Time Format Strings Custom Date and Time Format Strings

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

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
 11 окт. 2017 г., 05: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.

 eddiegroves22 сент. 2008 г., 05:48
Все эти методы хороши, но какой из них вы предлагаете?
 14 авг. 2014 г., 18:02
Обратите внимание, что & quot; правильно & quot; версия двух лучшихselect dateadd(dd, datediff(dd, 0, getdate()), 0), посколькуddзатем можно заменить на любой изthe datepart keywords обрезать дату в любом сегменте по вашему выбору. (Также обратите внимание, чтоdd это просто сокращение дляday.)

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

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

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

 24 сент. 2008 г., 07:00
111 это японский формат. дд YYY / мм /
 10 июл. 2013 г., 22:47
ВЫБРАТЬ КОНВЕРТ (VARCHAR (10), GETDATE (), 101)mm/dd/yyyy формат.
 eddiegroves22 сент. 2008 г., 05:41
Это возвращает "2008/09/22" для меня
 19 авг. 2015 г., 19:41
Работает на SQL Server 2005.
 14 сент. 2013 г., 02:34
если вы сортируете на основе значения необработанного текста (за пределами БД), то «японский» формат лучше

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

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

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

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

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

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

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

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

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

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

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

Решение Вопроса

На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

Плюсы:

No varchar<->datetime conversions required No need to think about locale
 22 сент. 2008 г., 06:04
+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал годами). Хороший.
 21 июн. 2013 г., 17:08
@ user1671639 тип данных datetime всегда содержит как дату, так и время, вы не можете разумно хранить одно без другого - если только вы не используете SQL Server 2008, в этом случае также существуют отдельные «date». и «время»; типы данных. Если вы используете CONVERT () подобным образом, вам действительно нужна строка для последующего использования, поэтому вы будете застревать, делая это таким образом - хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы вырезать дату - илиCAST(... AS DATE) или жеCONVERT(DATE, ...), который упоминался довольно часто на этой самой странице.
 24 сент. 2008 г., 10:25
Единственный недостаток, который я вижу в вашем решении, заключается в том, что, если вы не знаете, что он делает, он немного тупой. Использование метода двойного преобразования делает ваши намерения более очевидными для разработчиков кода. Кстати, я не проголосовал против вас. Я думаю, что я тоже начну использовать ваш метод. Спасибо @aku
 14 авг. 2014 г., 18:08
Я рекомендую изменить ответ наSELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0) потому что тогдаdd можно поменять на любой другойdatepart ключевое слово для усечения вашегоdatetime на произвольном уровне.
 18 авг. 2012 г., 00:03
@pilavdzice Установка даты до полуночи этого дняdoes ОСТАВЬТЕ ВРЕМЯ. Какой результат вы ожидаете?datetime тип данных не может иметьno time at all, Я думаю, что вы путаете хранение данных с презентацией пользователя. Если все, что вам нужно, это показать пользователю строку, которая не имеет временной части (не нули, просто пробелы), тогда вы просто хотитеConvert(varchar(30), @Date, 101) или что-то подобное. УвидетьSQL Server Books Online • Cast and Convert для получения дополнительной информации.

For return in date format

CAST(OrderDate AS date)

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

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

For SQL Server 2012 use the below code

CONVERT(VARCHAR(10), OrderDate , 111)
 02 мая 2014 г., 13:19
@Marek Отлично работает с MS SQL 2008
 25 сент. 2017 г., 04:22
@MaheshML Нет такого понятия, как SQL Server 2010.
 05 янв. 2014 г., 14:09
Это возвращает мне дату с нулевым временем, а не просто дату
 13 апр. 2014 г., 17:50
@MaheshML возвращает дату и время в MS SQL 2012.
 19 мар. 2014 г., 08:15
Могу ли я узнать, какую версию сервера sql вы используете?
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

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

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

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

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

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

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

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

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

set showplan_text on
GO 

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

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

SELECT CONVERT(varchar, MyDate, 101) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT 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.

 13 сент. 2010 г., 01:01
Заявления о равных показателях не соответствуют действительности. Конечно планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО быть сделано путем сравнения использования ЦП, а не изучения планов выполнения.
 24 сент. 2008 г., 07:30
Просто чтобы заметить, я выполнил тест 1000.000 раз. Я думаю, для реальных сценариев разница в производительности не будет заметна
 25 сент. 2008 г., 05:41
Аку, те же результаты. Нет разницы в производительности более десяти миллионов строк.
 24 сент. 2008 г., 07:29
Рикардо С, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с datediff для меня работает чуть быстрее.
 24 сент. 2008 г., 08:20
Аку, я использовал SQL Server 2005 Express для этого теста. Я работаю в 2000 году на работе, и я протестирую это с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

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

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

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

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

Дата:

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

Время:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

Ваш ответ на вопрос