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

SELECT GETDATE()

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

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

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

30 ответов


On 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

плюсы:

  • нет varchardatetime преобразования не требуется
  • нет необходимости думать о locale

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

SELECT CONVERT(date, GETDATE())

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

select cast(getdate() as date)

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

посмотреть планы выполнения запросы:

set showplan_text on
GO 

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

хотя решение конвертировать проще и легче читать для некоторых, это и медленнее. Нет необходимости возвращаться к 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(ДД, 0, MyDate)) от 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.


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

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

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


SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

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

CAST (OrderDate как дата)

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)

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

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

CAST и конвертировать

синтаксис для использования функции convert:

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

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

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

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) тот же код, что и предыдущие ответы пары, но код для преобразования в гггг-ММ-ДД с тире-121.

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

вы всегда должны идти вперед и верните тип данных dateTime вызывающей программе и на уровне презентации внесите необходимые корректировки. как только вы идете преобразования вещей, прежде чем вернуть их вызывающему абоненту, вы удаляете все надежды на ссылочную целостность из приложения. Это предотвратит операцию обновления или удаления, опять же, если вы не сделаете какую-то ручную реверсию, которая снова подвергает ваши данные ошибке human/code / gremlin, когда нет необходимость.


SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Edit: первые два метода по существу одинаковы, и out выполняют метод convert to varchar.


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

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

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


если вы используете SQL Server 2012 или выше версии,

использовать Format().

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

FORMAT ( value, format [, culture ] )

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

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

1."д" - короткий шаблон даты.

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        2011年10月1日

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

  1. стандартный формат даты и времени Струны
  2. пользовательские строки формата даты и времени

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

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

Если вам нужен результат в тип данных 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)) как OnlyDate --2014-03-26 00:00:00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) как 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


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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

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

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

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

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')

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

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

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

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

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


дата:

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

время:

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

начиная с SQL SERVER 2012, Вы можете сделать следующее:

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


в SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

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


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

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

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

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

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

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

DATEADD => the используется для возвращения одной части времени, такие как год, месяц, день, час, минута и т. д.

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

CONVERT() = > на


дата (поле Дата и время) и DATE_FORMAT (дата и время,'%Y-%m-%d') Как возвращает дата дата и время