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

StackOverflow https://stackoverflow.com/questions/113045

Вопрос

SELECT GETDATE()

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

Мне нужна эта часть даты без части времени: 2008-09-22 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

Плюсы:

  • Нет varchar<->datetime требуются преобразования
  • Не нужно думать о locale

Как предложил Майкл

Используйте этот вариант: SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

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

Другие советы

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.

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


ВЫБРАТЬ CONVERT(varchar, MyDate, 101) ИЗ DatesTable

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

ВЫБРАТЬ DATEADD(дд, 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 к плавающему и обратному значению не всегда дает исходное значение.

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

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

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

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

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

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

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

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

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

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

ВЛИЯТЬ И КОНВЕРТИРОВАТЬ

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

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

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

CAST (ДатаЗаказа КАК дата)

Приведенный выше код будет работать на сервере sql 2010.

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

Для SQL Server 2012 используйте приведенный ниже код

CONVERT(VARCHAR(10), OrderDate , 111)
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)

Если вы используете 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."D" - Длинная дата.

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 и получить тот же результат, что и в исходном заданном вопросе, то есть гггг-мм-дд, тогда используйте CONVERT(varchar(10),[SourceDate as dateTime],121) тот же код, что и в ответах предыдущей пары, но код для преобразования в гггг-мм-дд с тире — 121.

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

Вы должны ВСЕГДА возвращаться и возвращать тип данных dateTime вызывающей программе и на уровне ПРЕЗЕНТАЦИЯ внесите необходимые изменения. Как только вы начинаете конвертировать данные перед возвратом их вызывающему объекту, вы лишаете приложение всякой надежды на ссылочную целостность.Это снова предотвратит операцию UPDATE или DELETE, если только вы не выполните какое-то ручное восстановление, что снова подвергает ваши данные риску ошибки человека/кода/гремлина, когда в этом нет необходимости.

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.

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

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

Я надеюсь, что это полезно.

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

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

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

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

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)

Дата:

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

Время:

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

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

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

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

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

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

На SQL-сервере 2000

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

Просто вы можете сделать это следующим образом:

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

почему бы вам не использовать DATE_FORMAT( your_datetiem_column, '%d-%m-%Y')?

БЫВШИЙ: 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 также могла поддерживать переменную CURRENT_DATE стандарта ANSI.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top