如何编写CASE语句实现CURRENT_TIMESTAMP减30分钟的时间区间判断
首先明确判断逻辑:当max(timestamp)大于当前时间往前推30分钟的时间节点时,说明属于最近30分钟范围,返回Yes,否则返回No。
你之前的写法报错是因为CURRENT_TIMESTAMP返回的是原生时间戳类型,不是数值格式的Unix时间戳,不能直接和小数做算术运算,不同数据库的时间间隔运算语法有差异,以下是主流数据库的可用实现:
MySQL / MariaDB
使用DATE_SUB函数指定时间间隔:
CASE WHEN max(timestamp) > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 MINUTE) THEN 'Yes' ELSE 'No' END
如果需要判断最近1小时,把30 MINUTE替换为1 HOUR即可。
PostgreSQL
直接对时间戳做间隔运算:
CASE WHEN max(timestamp) > CURRENT_TIMESTAMP - INTERVAL '30 minutes' THEN 'Yes' ELSE 'No' END
SQL Server
使用DATEADD函数,注意参数顺序为「时间单位、偏移量、基准时间」:
CASE WHEN max(timestamp) > DATEADD(MINUTE, -30, CURRENT_TIMESTAMP) THEN 'Yes' ELSE 'No' END
Oracle
可以通过NUMTODSINTERVAL明确指定时间间隔类型:
CASE WHEN max(timestamp) > CURRENT_TIMESTAMP - NUMTODSINTERVAL(30, 'MINUTE') THEN 'Yes' ELSE 'No' END
如果你习惯用Unix时间戳做数值计算,也可以先把时间类型转成秒级数值再运算,以MySQL为例:
CASE WHEN UNIX_TIMESTAMP(max(timestamp)) > UNIX_TIMESTAMP() - 1800 THEN 'Yes' ELSE 'No' END
注:原写法的两个WHEN分支没有覆盖max(timestamp)和基准时间相等的场景,会返回NULL,用ELSE替代第二个WHEN逻辑更严谨。
内容的提问来源于stack exchange,提问作者Luka Vlaskalic
相关产品推荐
相关产品推荐

