12

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

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

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

我该怎么做呢?

4

5 回答 5

17

您只需要对已有的内容进行细微调整。

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

使用CONVERT将您的更改DATETIMETIME.

SELECT  *
FROM    progen.DY
WHERE   CONVERT(TIME, DY_DATE) <> '00:00:00:000'
于 2013-02-27T06:26:01.233 回答
3

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

它的工作方式是我们首先计算 epoch 和 value 之间的差异(以天为单位)。我们将该数字添加到纪元以创建新的日期时间。由于结果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。

于 2013-02-27T05:46:41.030 回答
3

另一种方法是将其转换为不同的数据类型,例如

SELECT  *
FROM    progen.DY
WHERE   CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0
于 2013-02-27T05:52:11.490 回答
3

在尝试查看是否应将表的列转换为日期而不是日期时间时,我一直这样做,这确实是答案。

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

演员表删除了时间,而日期时间具有更高的优先级,因此在比较时,如果它们不相等,则它具有时间值。同样的事情可以通过时间转换来完成,但语法略有不同。

于 2013-02-27T05:54:43.790 回答
2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'
于 2013-02-27T05:48:53.937 回答