MS SQL如何实现查询时间戳小于等于上周六06:30:00的数据
MS SQL 上周六6:30及之前数据查询实现方案
直接给出可正常运行的代码方案,适配不同版本场景:
通用兼容方案(支持SQL Server 2008及以上所有版本)
不受实例DATEFIRST配置影响,计算结果稳定:
SELECT * FROM [Data] WHERE [TimeStamp] <= DATEADD(MINUTE, 6*60 + 30, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - (DATEDIFF(DAY, 5, GETDATE()) % 7), 0) )
逻辑说明:
DATEDIFF(DAY, 0, GETDATE())取当前日期距离1900-01-01的天数,转换为当前日期零点- 1900-01-06是周六,
DATEDIFF(DAY, 5, GETDATE()) %7计算得到当前距离上周六的天数,减去对应天数即可拿到上周六零点 - 最后加6小时30分,得到上周六06:30的时间点
- 表名
Data、字段名TimeStamp属于SQL Server保留字,用方括号包裹避免语法报错
简化写法(仅支持SQL Server 2022及以上版本)
用DATE_BUCKET函数简化日期计算逻辑:
SELECT * FROM [Data] WHERE [TimeStamp] <= DATEADD(MINUTE, 390, DATE_BUCKET(DAY, 1, GETDATE(), DATEFROMPARTS(1900, 1, 6)) )
如果需要适配时区或者替换为指定日期对应的上周六,把GETDATE()替换为对应的日期变量/函数即可,比如时区适配用SYSDATETIMEOFFSET(),指定日期用'2024-05-20'这类合法日期格式即可。
内容的提问来源于stack exchange,提问作者Josh Gilbert
相关产品推荐
相关产品推荐

