2013-02-27 4 views
7

У меня есть столбец, который хранит данные в формате datetime. Я хочу проверить все экземпляры, где временная часть этого столбца не равна 00: 00: 00: 000 - дата не имеет значения.Как проверять время на полях datetime, но игнорировать дату?

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

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

Как я могу идти об этом?

ответ

9

Вам нужна только небольшая настройка того, что у вас уже есть.

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

Используйте CONVERT, чтобы изменить свою DATETIME к TIME.

SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000' 
+0

Есть ли какие-либо ограничения или проблемы с этим методом? Мне кажется странным, что это потребовалось так долго, чтобы его предлагали (на основе других ответов), если это действительно лучший способ? – Codingo

+0

@Michael Нет никаких ограничений делать это так, по крайней мере, не по сравнению с другими ответами.Плохая вещь о применении функций в таких столбцах заключается в том, что любые индексы в этом столбце нельзя использовать, и SQL Server должен выполнить сканирование таблицы, чтобы выяснить, какие строки вам нужны. –

3

Используйте 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 недоступно.

2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00' 
3

Другой способ заключается в преобразовании его на другой тип данных, например

SELECT * 
FROM progen.DY 
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0 
2

Я делаю это все время при попытке посмотреть, если добавлен столбец таблицы должны быть превратился в дату вместо даты и времени, что на самом деле является ответом.

select * 
from progen.dy 
where cast(dy_date as Date) <> dy_date 

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

Смежные вопросы