我有一个以datetime格式存储数据的列。我想检查这个列的时间部分不等于00:00:00:000的所有实例 - 日期无关紧要。如何只检查日期时间字段上的时间,但忽略日期?
基本上,如果时间()是一个功能,是这样的:
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
我如何去这样做呢?
我有一个以datetime格式存储数据的列。我想检查这个列的时间部分不等于00:00:00:000的所有实例 - 日期无关紧要。如何只检查日期时间字段上的时间,但忽略日期?
基本上,如果时间()是一个功能,是这样的:
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
和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。
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'
另一种方法是将其转换为不同的数据类型,如
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
铸造去除时间和日期时间具有较高优先级,所以进行比较时,如果不相等则它有一个时间值。同样的事情可以通过一次演员来完成,具有一些不同的语法。
这种方法是否有任何限制/疑虑?对我来说这似乎很奇怪,如果这真的是最好的方法,这需要很长时间才能提出(基于其他答案)? – Codingo 2013-02-27 06:30:26
@Michael这样做没有限制,至少没有与其他答案相比。在这样的列上应用函数的坏处是,该列上的任何索引都无法使用,SQL Server必须执行表扫描才能找出需要的行。 – 2013-02-27 06:38:15