SQL Server 2017中如何按非整点时间筛选datetime字段记录
筛选SQL Server datetime字段的时分秒部分
在SQL Server 2017中,针对datetime类型字段systime,要忽略日期部分、仅按具体时分秒筛选记录(比如筛选17:30及之后、或19:25及之前的记录),以下是几种实用方法:
方法1:转换为TIME类型直接比较
这是最直观简洁的方式,将datetime字段转换为TIME类型后,直接和目标时间字符串对比:
-- 筛选17:30及之后的记录 SELECT * FROM myTable WHERE CAST(systime AS TIME) >= '17:30:00' -- 筛选19:25及之前的记录 SELECT * FROM myTable WHERE CAST(systime AS TIME) <= '19:25:00'
TIME类型仅保留时分秒信息,自动忽略日期部分,因此可以直接进行时间范围判断。
方法2:计算总分钟数对比
通过DATEPART提取小时和分钟,转换为当日总分钟数后进行数值比较:
-- 17:30 转换为总分钟数:17*60 + 30 = 1050 SELECT * FROM myTable WHERE DATEPART(HOUR, systime)*60 + DATEPART(MINUTE, systime) >= 1050 -- 19:25 转换为总分钟数:19*60 +25 = 1165 SELECT * FROM myTable WHERE DATEPART(HOUR, systime)*60 + DATEPART(MINUTE, systime) <= 1165
如果需要精确到秒,只需再加上DATEPART(SECOND, systime)/60.0即可实现更细致的筛选。
方法3:计算当日时间间隔
通过DATEDIFF计算当前时间与当日凌晨的时间差,再和目标时间的时间差对比:
-- 17:30 距离当日凌晨的秒数:17*3600 +30*60 = 63000 SELECT * FROM myTable WHERE DATEDIFF(SECOND, CAST(CAST(systime AS DATE) AS DATETIME), systime) >= 63000
这种方式适合需要基于时间间隔做复杂逻辑判断的场景。
测试验证
用你提供的示例值测试:比如2015-05-20 18:23:49.000转换为TIME后是18:23:49,会被>= '17:30:00'和<= '19:25:00'的条件同时命中;而2015-08-30 21:34:52.000只会被>= '17:30:00'的条件选中。
内容的提问来源于stack exchange,提问作者dnk
相关产品推荐
相关产品推荐

