MS SQL Дата только без времени - PullRequest
38 голосов
/ 22 января 2009

Вопрос

Привет всем,

В течение довольно долгого времени у меня возникала путаница, когда я по существу определял тип SQL DateTime с использованием T-SQL. По сути, я хочу взять значение DateTime, скажем, 2008-12-1 14:30:12 и сделать его 2008-12-1 00:00:00. Во многих запросах, которые мы запускаем для отчетов, используется значение даты в предложении WHERE, но у меня либо значение даты начала и окончания дня, и используется BETWEEN, либо я нахожу какой-то другой метод.

В настоящее время я использую следующее: WHERE CAST(CONVERT(VARCHAR, [tstamp], 102) AS DATETIME) = @dateParam

Однако, это кажется неуклюжим. Я надеялся, что будет что-то более простое, как CAST([tstamp] AS DATE)

В некоторых местах в Интернете рекомендуется использовать функцию DATEPART (), но затем я получаю что-то вроде этого:


WHERE DATEPART(year, [tstamp]) = DATEPART(year, @dateParam)
AND DATEPART(month, [tstamp]) = DATEPART(month, @dateParam)
AND DATEPART(day, [tstamp]) = DATEPART(day, @dateParam)

Может быть, я слишком обеспокоен чем-то маленьким, и если да, пожалуйста, дайте мне знать. Я просто хочу убедиться, что материал, который я пишу, максимально эффективен. Я хочу устранить любые слабые звенья.

Есть предложения?

Спасибо,
С

Решение

Спасибо всем за отличную обратную связь. Много полезной информации. Я собираюсь изменить наши функции, чтобы исключить функцию с левой стороны оператора. Хотя большинство наших столбцов даты не используют индексы, это, вероятно, все еще более эффективная практика.

Ответы [ 12 ]

0 голосов
/ 22 января 2009
WHERE DATEDIFF(day, tstamp, @dateParam) = 0

Это поможет вам, если вас не волнует время.

Это ответ на мета-вопрос о сравнении дат двух значений, когда вам нет дела до времени.

0 голосов
/ 22 января 2009

Вот запрос, который вернет все результаты в течение нескольких дней.

DECLARE @startDate DATETIME
DECLARE @endDate DATETIME

SET @startDate = DATEADD(day, -30, GETDATE())
SET @endDate = GETDATE()

SELECT *
FROM table
WHERE dateColumn >= DATEADD(day, DATEDIFF(day, 0, @startDate), 0)
  AND dateColumn <  DATEADD(day, 1, DATEDIFF(day, 0, @endDate))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...