我有一个以datetime格式存储数据的列。我想检查此列的时间部分不等于00:00:00:000的所有实例 - 日期无关紧要。
基本上,如果time()是一个函数,就像这样:
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
我该怎么做?
答案 0 :(得分:13)
您只需对已有的内容稍作调整即可。
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'
答案 1 :(得分:3)
使用DATEDIFF
和DATEADD
代替获取日期时间的日期部分。将列与仅日期进行比较,它将返回那些具有非零时间的行。
这种方法的工作方式是我们首先计算时期和价值之间的差异(以天为单位)。我们将该数字添加到纪元以创建新的日期时间。由于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
编辑如其他答案中所述,您可以转换为DATE
以达到与DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)
相同的效果,这可以很好地清理。但是,DATE仅在SQL Server 2008中添加,而该公式至少与SQL 2000兼容。因此,如果您需要向后兼容性或正在处理SQL CE,则转换为DATE不可用。
答案 2 :(得分:3)
另一种方法是将其转换为不同的数据类型,例如
SELECT *
FROM progen.DY
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0
答案 3 :(得分:3)
我一直在尝试查看表格的列是否应该变成日期而不是日期时间,这才是答案。
select *
from progen.dy
where cast(dy_date as Date) <> dy_date
强制转换会删除时间,而日期时间具有更高的优先级,因此在进行比较时,如果不相等,则它具有时间值。同样的事情可以通过演绎来完成,语法有点不同。
答案 4 :(得分:2)
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'