按优先级取datetime值比较时间范围筛选数据存入临时表方案咨询
需求实现方案
核心逻辑说明
你要求的优先级取非空时间值的逻辑刚好可以用SQL标准函数COALESCE实现,这个函数会返回传入参数里第一个非NULL的值,完美匹配DateTime1>DateTime2>DateTime3的取值优先级。之后计算取到的目标时间和当前时间的差值,筛选出差值小于2小时的记录插入临时表即可。
为了避免按小时取整导致的边界判断错误,推荐用秒作为差值计算单位,2小时对应7200秒,判断更精准。
各主流数据库实现代码
MySQL 版本
-- 直接创建临时表并写入符合条件的数据 CREATE TEMPORARY TABLE temp_filtered_data AS SELECT Data1, DateTime1, DateTime2, DateTime3 FROM 你的源表名称 -- 计算时间差小于7200秒(2小时) WHERE TIMESTAMPDIFF(SECOND, COALESCE(DateTime1, DateTime2, DateTime3), NOW()) < 7200;
如果需要同时兼容未来2小时内的记录,把差值计算套上ABS()即可:ABS(TIMESTAMPDIFF(SECOND, COALESCE(DateTime1, DateTime2, DateTime3), NOW())) < 7200
SQL Server 版本
-- 直接创建临时表并写入符合条件的数据 SELECT Data1, DateTime1, DateTime2, DateTime3 INTO #temp_filtered_data FROM 你的源表名称 WHERE DATEDIFF(SECOND, COALESCE(DateTime1, DateTime2, DateTime3), GETDATE()) < 7200;
Oracle 版本
-- 先定义临时表结构 CREATE GLOBAL TEMPORARY TABLE temp_filtered_data ( Data1 VARCHAR2(100), DateTime1 DATE, DateTime2 DATE, DateTime3 DATE ) ON COMMIT PRESERVE ROWS; -- 写入符合条件的数据 INSERT INTO temp_filtered_data SELECT Data1, DateTime1, DateTime2, DateTime3 FROM 你的源表名称 -- Oracle日期相减得到的是天数,乘以86400转换为秒 WHERE (SYSDATE - COALESCE(DateTime1, DateTime2, DateTime3)) * 86400 < 7200;
内容的提问来源于stack exchange,提问作者VirVir
相关产品推荐
相关产品推荐

