2013-02-27 116 views
7

我有一个以datetime格式存储数据的列。我想检查这个列的时间部分不等于00:00:00:000的所有实例 - 日期无关紧要。如何只检查日期时间字段上的时间,但忽略日期?

基本上,如果时间()是一个功能,是这样的:

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

我如何去这样做呢?

回答

9

你只需要对你已有的东西进行小小的调整。

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' 
+0

这种方法是否有任何限制/疑虑?对我来说这似乎很奇怪,如果这真的是最好的方法,这需要很长时间才能提出(基于其他答案)? – Codingo 2013-02-27 06:30:26

+0

@Michael这样做没有限制,至少没有与其他答案相比。在这样的列上应用函数的坏处是,该列上的任何索引都无法使用,SQL Server必须执行表扫描才能找出需要的行。 – 2013-02-27 06:38:15

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
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00' 
3

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

SELECT * 
FROM progen.DY 
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0 
2

我这个做想看看表的列应该是当所有的时间变成日期而不是日期,这真的是答案。

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

铸造去除时间和日期时间具有较高优先级,所以进行比较时,如果不相等则它有一个时间值。同样的事情可以通过一次演员来完成,具有一些不同的语法。

相关问题