我有一列以日期时间格式存储数据。我想检查此列的时间部分不等于 00:00:00:000 的所有实例 - 日期无关紧要。
基本上,如果 time() 是一个函数,就像这样:
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
我该怎么做呢?
我有一列以日期时间格式存储数据。我想检查此列的时间部分不等于 00:00:00:000 的所有实例 - 日期无关紧要。
基本上,如果 time() 是一个函数,就像这样:
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
我该怎么做呢?
您只需要对已有的内容进行细微调整。
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'
使用DATEDIFF
andDATEADD
来获取日期时间的日期部分。仅将该列与日期进行比较,它将返回那些具有非零时间的行。
它的工作方式是我们首先计算 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。
另一种方法是将其转换为不同的数据类型,例如
SELECT *
FROM progen.DY
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0
在尝试查看是否应将表的列转换为日期而不是日期时间时,我一直这样做,这确实是答案。
select *
from progen.dy
where cast(dy_date as Date) <> dy_date
演员表删除了时间,而日期时间具有更高的优先级,因此在比较时,如果它们不相等,则它具有时间值。同样的事情可以通过时间转换来完成,但语法略有不同。
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'