如何编写SQL实现起始为给定日期午夜后1秒、结束为午夜前1秒的查询
SQL查询时间区间参数设置方案
按需求设置@from、@to的偏移逻辑
以SQL Server语法为例,你可以直接对输入的日期参数做秒级偏移处理,实现你要的取值规则:
-- 给参数赋值:@inputStartDate为输入的起始日期(此处为'2021-05-14'),@inputEndDate为输入的结束日期(此处为'2021-05-15') SET @from = DATEADD(SECOND, 1, CAST(@inputStartDate AS DATETIME)) SET @to = DATEADD(SECOND, -1, DATEADD(DAY, 1, CAST(@inputEndDate AS DATETIME))) -- 原有查询语句无需修改 SELECT * FROM tblUSER WHERE UpdatedTime > @from AND UpdatedTime < @to
其他数据库仅需替换对应的日期运算函数即可:
- MySQL:使用
DATE_ADD函数,示例:SET @from = DATE_ADD(@inputStartDate, INTERVAL 1 SECOND); - PostgreSQL:使用
INTERVAL语法计算偏移,示例:@from := @inputStartDate::TIMESTAMP + INTERVAL '1 second';
更推荐的优化写法(避免时间精度问题)
实际使用中更建议用半开区间写法,不需要处理秒级偏移,还能避免部分数据库datetime精度高于秒级(如毫秒、微秒)导致的记录遗漏问题,查询效果和你要求的完全一致:
SELECT * FROM tblUSER WHERE UpdatedTime >= @inputStartDate AND UpdatedTime < DATEADD(DAY, 1, CAST(@inputEndDate AS DATETIME))
该写法会自动覆盖2021-05-14 00:00:00到2021-05-15 23:59:59.999...的所有时间戳记录,逻辑更简洁,兼容性更强。
内容的提问来源于stack exchange,提问作者Wymo Oo
相关产品推荐
相关产品推荐

