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


SELECT GETDATE()

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

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

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


1373


источник


Ответы:


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

2009



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

SELECT CONVERT(date, GETDATE())

652



Если вы используете SQL 2008 и выше:

select cast(getdate() as date)

140



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

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

set showplan_text on
GO 

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

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

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

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

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

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


66



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

41



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

34



You can use the CONVERT function to return only the date. See the link(s) below:

Date and Time Manipulation in SQL Server 2000

CAST and CONVERT

The syntax for using the convert function is:

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

19



For return in date format

CAST(OrderDate AS date)

The above code will work in sql server 2010

It will return like 12/12/2013

For SQL Server 2012 use the below code

CONVERT(VARCHAR(10), OrderDate , 111)

17