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

SELECT GETDATE()

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

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

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

51 ответ

Решение

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

SQLServer 2008 теперь имеет тип данных date, который содержит только дату без компонента времени. Любой, кто использует 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.

Хотя решение 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.

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

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

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

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

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

SELECT CAST(date_variable AS date)

или с PostgreSQL:

SELECT date_variable::date

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

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

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)

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

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

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

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

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

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

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

  1. Стандартные строки формата даты и времени
  2. Пользовательские строки формата даты и времени
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

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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.

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

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

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

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

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

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

Дата:

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

Время:

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

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

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

Синтаксис:

      SELECT CONVERT (data_type(length)),Date, DateFormatCode)

Бывший:

      Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]

все коды формата даты о дате:

      DateFormatCode  Format
1       [MM/DD/YY]
2       [YY.MM.DD]
3       [DD/MM/YY]
4       [DD.MM.YY]
5       [DD-MM-YY]
6       [DD MMM YY]
7       [MMM DD,YY]
10      [MM-DD-YY]
11      [YY/MM/DD]
12      [YYMMDD]
23      [yyyy-mm-dd]
101     [MM/DD/YYYY]
102     [YYYY.MM.DD]
103     [DD/MM/YYYY]
104     [DD/MM/YYYY]
105     [DD/MM/YYYY]
106     [DD MMM YYYY]
107     [MMM DD,YYYY]
110     [MM-DD-YYYY]
111     [YYYY/MM/DD]
112     [YYYYMMDD]

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

ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (VARCHAR(10), getdate(), 111);

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

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

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

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

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

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')
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

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

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

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

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

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

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

Другие вопросы по тегам