我正在使用 oracle sql developer 来获取周末数据。当查询在星期一运行时,它会获取上周末的数据。
此查询有效
SELECT * FROM
(
select
mm.r_number,
s.holder,
trunc(mm.received_date) - TRUNC(SYSDATE-2) as received_date
FROM messages mm
JOIN items s ON (mm.r_number = s.service_num)
WHERE account_number = 12353
AND r_number in ('0000928158','0000927608','0000927610','0000945321')
)
PIVOT
(
COUNT(received_date)
FOR received_date in (1 as Sunday, 2 as Saturday)
)
ORDER BY r_number
原始数据
r_number | s.holder | mm.received_date |
---|---|---|
0000928158 | LVAD 紧急情况 (AH) | 17-MAR-21 |
0000928158 | LVAD 紧急情况 (AH) | 16-MAR-21 |
0000927610 | 接收/药房 | 15-MAR-21 |
输出是
问题:如何获取日期而不是天
答案 0 :(得分:1)
您需要在 PL/SQL 块中使用动态 SQL。类似的东西:
DECLARE
strSaturday_column VARCHAR2(30) := TO_CHAR(SYSDATE-2, 'DD-MON-YYYY');
strSunday_column VARCHAR2(30) := TO_CHAR(SYSDATE-1, 'DD-MON-YYYY');
rc SYS_REFCURSOR;
nR_number NUMBER;
strHolder VARCHAR2(2000);
nSaturday NUMBER;
nSunday NUMBER;
tab CHAR(1) := CHR(9);
BEGIN
OPEN rc FOR
'SELECT R_NUMBER, HOLDER, SATURDAY AS ' || strSaturday_column ||
' SUNDAY AS ' || strSunday_column ||
' FROM (SELECT *
FROM (select mm.r_number,
s.holder,
trunc(mm.received_date) - TRUNC(SYSDATE-2) as received_date
FROM messages mm
JOIN items
ON (mm.r_number = s.service_num)
WHERE account_number = 12353 AND
r_number in ('0000928158','0000927608','0000927610','0000945321'))
PIVOT (COUNT(received_date)
FOR received_date in (1 as Sunday, 2 as Saturday)))
ORDER BY r_number';
DBMS_OUTPUT.PUT_LINE('R_NUMBER' || tab || 'HOLDER' || tab ||
strSaturday_column || tab || strSunday_column);
LOOP
FETCH rc
INTO nR_number,
strHolder,
nSaturday,
nSunday;
EXIT WHEN rc%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(nR_number || tab || strHolder || tab ||
nSaturday || tab || nSunday);
END LOOP;
END;