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

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

1624
задан TylerH 6 October 2017 в 17:36
поделиться

9 ответов

На 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 преобразования потребовали
  • Никакая потребность думать [приблизительно 1 110]
<час>

, Как предложено [1 112] Использование Michael

этот вариант: 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
2327
ответ дан Michael Buen 6 October 2017 в 17:36
поделиться

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

SELECT CONVERT(date, GETDATE())
697
ответ дан BenR 6 October 2017 в 17:36
поделиться

DATEADD и DATEDIFF лучше, чем ПРЕОБРАЗОВАНИЕ в varchar. Оба запроса имеют тот же план выполнения, но планы выполнения являются, в первую очередь [приблизительно 1 116] данными стратегии доступа и не всегда показывают неявные затраты, включенные в процессорное время, потраченное для выполнения всех частей. Если оба запроса выполняются против таблицы с миллионами строк, процессорное время с помощью DateDiff может быть близко к 1/3-му из процессорного времени Преобразования!

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

set showplan_text on
GO 

И DATEADD и DATEDIFF выполнят CONVERT_IMPLICIT.

, Хотя решение для ПРЕОБРАЗОВАНИЯ более просто и легко для чтения для некоторых, это медленнее. Нет никакой потребности вспомнить дату и время (это неявно сделано сервером). Нет также никакой реальной потребности в методе DateDiff для DateAdd позже, поскольку целочисленный результат будет также неявно преобразован назад в дату и время.

<час>

ИЗБРАННОЕ ПРЕОБРАЗОВАНИЕ (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)) ОТ 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]))

Используя ПОЛ () как @digi предложенный имеет производительность ближе к DateDiff, но не рекомендуется, поскольку кастинг типа данных datetime, чтобы плавать и отступить не всегда приводит к исходному значению.

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

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

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

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

70
ответ дан 10 revs, 5 users 74% 6 October 2017 в 17:36
поделиться

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

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

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

47
ответ дан Vladimir Vagaytsev 6 October 2017 в 17:36
поделиться
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
38
ответ дан abatishchev 6 October 2017 в 17:36
поделиться

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

Управление Датой и временем в SQL Server 2000

БРОСОК и ПРЕОБРАЗОВЫВАЕТ

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
20
ответ дан ughai 6 October 2017 в 17:36
поделиться

Используя ПОЛ () - просто часть времени сокращения.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
12
ответ дан DiGi 6 October 2017 в 17:36
поделиться
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
ответ дан chancrovsky 6 October 2017 в 17:36
поделиться

Если Вы хотите, чтобы дата показала 2008-09-22 00:00:00.000

затем, Вы можете вокруг нее с помощью

SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

, Это покажет дату в формате в вопросе

1
ответ дан 22 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: