SQL 查询日间未给出正确结果

问题描述 投票:0回答:1

我的sql脚本在单天运行时给出正确的结果,但是当使用条件运行以获取脚本中30天数据之间的输出时得到错误的结果。

SELECT TIMESTAMP,SUM(fs) AS "fs" FROM (SELECT TO_CHAR(TRUNC(A.TIMESTAMP), 'MM/DD/YY') AS 
"TIMESTAMP", COUNT(UNIQUE A.ID) AS "fs" FROM ( SELECT * FROM ag_se se WHERE EVENTID IN ('AS20')
AND TRUNC(TIMESTAMP)  between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_sw sw 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_mw mw 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_w w 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_bl bl 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1)) A, aglogin B WHERE A.EVENTID IN ('AS20') 
AND B.AGENTROLE IN ('FS_SW_EC','FS_SE_EC','FS_W_EC','FS_MW_EC') AND TRUNC(A.TIMESTAMP) between (sysdate-30) and (sysdate -1) 
AND A.ID =B.ID AND TRUNC(B.LOGINLOGOUTTIME) between  (sysdate-30) and (sysdate -1) GROUP BY B.AGENTROLE, TO_CHAR(TRUNC(A.TIMESTAMP), 'MM/DD/YY')) 
GROUP BY TIMESTAMP;

但是在以下条件下运行时输出是正确的:-

SELECT TIMESTAMP,SUM(fs) AS "fs" FROM (SELECT TO_CHAR(TRUNC(A.TIMESTAMP), 'MM/DD/YY') AS 
"TIMESTAMP", COUNT(UNIQUE A.ID) AS "fs" FROM ( SELECT * FROM ag_se se WHERE EVENTID IN ('AS20')
AND TRUNC(TIMESTAMP)  =trunc(sysdate-30) UNION ALL SELECT * FROM ag_sw sw 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) =trunc(sysdate-30) UNION ALL SELECT * FROM ag_mw mw 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) =trunc(sysdate-30) UNION ALL SELECT * FROM ag_w w 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) =trunc(sysdate-30) UNION ALL SELECT * FROM ag_bl bl 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) =trunc(sysdate-30)) A, aglogin B WHERE A.EVENTID IN ('AS20') 
AND B.AGENTROLE IN ('FS_SW_EC','FS_SE_EC','FS_W_EC','FS_MW_EC') AND TRUNC(A.TIMESTAMP) =trunc(sysdate-30) 
AND A.ID =B.ID AND TRUNC(B.LOGINLOGOUTTIME) between  (trunc(sysdate-30)) and (sysdate -1) GROUP BY B.AGENTROLE, TO_CHAR(TRUNC(A.TIMESTAMP), 'MM/DD/YY')) 
GROUP BY TIMESTAMP;

我的问题是如何在脚本中获取过去 30 天的输出,因为单独运行查询将需要更多时间。

SELECT TIMESTAMP,SUM(fs) AS "fs" FROM (SELECT TO_CHAR(TRUNC(A.TIMESTAMP), 'MM/DD/YY') AS 
"TIMESTAMP", COUNT(UNIQUE A.ID) AS "fs" FROM ( SELECT * FROM ag_se se WHERE EVENTID IN ('AS20')
AND TRUNC(TIMESTAMP)  between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_sw sw 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_mw mw 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_w w 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1) UNION ALL SELECT * FROM ag_bl bl 
WHERE EVENTID IN ('AS20') AND TRUNC(TIMESTAMP) between (sysdate-30) and (sysdate -1)) A, aglogin B WHERE A.EVENTID IN ('AS20') 
AND B.AGENTROLE IN ('FS_SW_EC','FS_SE_EC','FS_W_EC','FS_MW_EC') AND TRUNC(A.TIMESTAMP) between (sysdate-30) and (sysdate -1) 
AND A.ID =B.ID AND TRUNC(B.LOGINLOGOUTTIME) between  (sysdate-30) and (sysdate -1) GROUP BY B.AGENTROLE, TO_CHAR(TRUNC(A.TIMESTAMP), 'MM/DD/YY')) 
GROUP BY TIMESTAMP;
sql oracle plsql plsqldeveloper
1个回答
0
投票

问题可能是由将 Trunc(TIMESTAMP) 与周期 sysdate-30 和 sysdate-1 进行比较的条件(在第二个查询中)引起的。即 TRUNC(TIMESTAMP) 是 00:00:00 的日期,sysdate 包含一个时间部分(还有 -30 和 -1)。第一个查询将 TRUN(TIMESTAMP) 与 TRUNC(SYSDATE) 进行比较,因此两侧都有一个没有时间部分的日期部分。

尝试将第二个查询条件更改为:

...
    TRUNC(TIMESTAMP) between TRUNC(sysdate-30) and TRUNC(sysdate -1)
...
© www.soinside.com 2019 - 2024. All rights reserved.