Используйте DATEDIFF
и DATEADD
, чтобы вместо этого получить дату в дате. Сравните столбец только с датой, и он вернет те строки, у которых есть ненулевое время.
Как это работает, мы сначала вычислим разницу (в днях) между эпохой и значением. Мы добавляем это число в эпоху, чтобы создать новое datetime. Поскольку результат DATEDIFF
является целым числом, любой компонент времени округляется.
SELECT *
FROM Table
WHERE DateColumn <> DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)
Функция времени может затем быть реализованы в следующем, не то, что я рекомендую для этого конкретного сценария:
SELECT DATEDIFF(minute, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay,
-- or, if you require higher precision
DATEDIFF(second, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay
FROM Table
Edit: Как уже упоминалось в других ответах, вы можете лить в DATE
для достижения такого же эффекта, как DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)
, который хорошо очищает. Тем не менее, DATE был добавлен только в SQL Server 2008, тогда как формула имеет совместимость, по крайней мере, с SQL 2000. Поэтому, если вам нужна обратная совместимость или имеет дело с SQL CE, приведение в DATE недоступно.
Есть ли какие-либо ограничения или проблемы с этим методом? Мне кажется странным, что это потребовалось так долго, чтобы его предлагали (на основе других ответов), если это действительно лучший способ? – Codingo
@Michael Нет никаких ограничений делать это так, по крайней мере, не по сравнению с другими ответами.Плохая вещь о применении функций в таких столбцах заключается в том, что любые индексы в этом столбце нельзя использовать, и SQL Server должен выполнить сканирование таблицы, чтобы выяснить, какие строки вам нужны. –