如何只检查日期时间字段的时间但忽略日期?

时间:2013-02-27 05:38:36

标签: sql sql-server-2008 tsql

我有一个以datetime格式存储数据的列。我想检查此列的时间部分不等于00:00:00:000的所有实例 - 日期无关紧要。

基本上,如果time()是一个函数,就像这样:

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

我该怎么做?

5 个答案:

答案 0 :(得分:13)

您只需对已有的内容稍作调整即可。

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

使用CONVERTDATETIME更改为TIME

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

答案 1 :(得分:3)

使用DATEDIFFDATEADD代替获取日期时间的日期部分。将列与仅日期进行比较,它将返回那些具有非零时间的行。

这种方法的工作方式是我们首先计算时期和价值之间的差异(以天为单位)。我们将该数字添加到纪元以创建新的日期时间。由于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'
相关问题