【问题标题】:Query to find out total patients for 15 days查询 15 天内的患者总数
【发布时间】:2021-01-30 17:58:34
【问题描述】:

我有一个问题。我有一个查询,可以找出当天的患者人数

Select wtt1.wrt_ip_num, wtt1.wrt_from_ward_cd, wbm.wbm_room_num, wbm.wbm_bed_num, wtt1.wrt_in_dt, wtt1.wrt_out_dt
FROM W_TRANSFER_TXN wtt1, w_ward_master_base wmb, w_bed_master_base wbm
where wtt1.wrt_from_ward_cd=wmb.wwm_ward_cd and wmb.wwm_ward_locn='TMH' 
  and wbm.wbm_bed_num=wtt1.wrt_from_bed_num and wbm.wbm_room_num=wtt1.wrt_from_room_num and wbm.wbm_ward_cd=wtt1.wrt_from_ward_cd 
  and (wtt1.wrt_ip_num, wtt1.wrt_sl_num ) in 
    (Select wtt.wrt_ip_num, max(wtt.wrt_sl_num) wrt_sl_num 
    FROM W_TRANSFER_TXN wtt
    where /*wtt.wrt_ip_num='IP/20/034619' and*/ trunc(wtt.wrt_in_dt)<=TO_DATE('29-Sep-2020','DD-MON-YYYY') 
          and (wtt.wrt_out_dt is null or trunc(wtt.wrt_out_dt)>=TO_DATE('29-Sep-2020','DD-MON-YYYY'))
    group by wtt.wrt_ip_num);

目前它取出日期 29th 的 ip 号。它给出了没有。该特定日期的 IP 号码。 我想要做的是将整个查询放在一个循环中,它会找出前 15 天的查询。那可能吗 。整个查询可以循环过去 15 天吗? 我们可以在日期字段所在的地方循环吗? 我可以通过更改日期来取出每天的患者数量,但我可以找出 15 天吗?

【问题讨论】:

  • 这是我们可以在日期所在的循环中输入的查询吗?
  • 为什么要使用循环并发送 15 个查询而不是一个查询来获取整个 15 天的所有数据?此外,您是否能够“整理”您的查询,使其更具可读性并且没有过时的信息(对我们而言)?我会使用trunc(wtt.wrt_in_dt) between to_date('29.....') and to_date('14.....')
  • 整个查询是为了给 1 个日期的值而开发的,可以把整个查询放在一个循环中吗?
  • 入住日期和离开日期是针对当天入住和离开的患者
  • where trunc(wtt.wrt_in_dt) between TO_DATE('29-Sep-2020','DD-MON-YYYY')-15 and TO_DATE('29-Sep-2020','DD-MON-YYYY') and (wtt.wrt_out_dt is null or trunc(wtt.wrt_out_dt)&gt;=trunc(wtt.wrt_in_dt))?

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

当您将 wtt.wrt_in_dt 固定为 date '2020-09-29' 时,查询会返回该特定日期的数据。

考虑将条件更改为

trunc(wtt.wrt_in_dt) >= trunc(sysdate) - 15

这将返回 wrt_in_dt 在过去 15 天内的行。


如何生成日期?

SQL> select date '2020-10-20' + level - 1 datum
  2  from dual
  3  connect by level <= 5;

DATUM
----------
20.10.2020
21.10.2020
22.10.2020
23.10.2020
24.10.2020

SQL>

如果您想在 FOR 循环中使用日期,则必须将日期“转换”为 Julian 日期(其数据类型为 NUMBER)作为 FOR 循环不允许日期作为边界。这也意味着您必须将该 Julian 日期转换回用于查询。我没有合适的桌子,所以DBMS_OUTPUT.PUT_LINE 将不得不这样做。

SQL> set serveroutput on
SQL>
SQL> DECLARE
  2     l_datum         DATE := TRUNC (SYSDATE);
  3     l_datum_julian  NUMBER := TO_NUMBER (TO_CHAR (l_datum, 'j'));
  4  BEGIN
  5     FOR i IN l_datum_julian .. l_datum_julian + 5
  6     LOOP
  7        DBMS_OUTPUT.put_line (TO_CHAR (TO_DATE (i, 'j'), 'dd.mm.yyyy'));
  8     END LOOP;
  9  END;
 10  /
16.10.2020
17.10.2020
18.10.2020
19.10.2020
20.10.2020
21.10.2020

PL/SQL procedure successfully completed.

SQL>

【讨论】:

  • 其实整个查询都是为我们可以循环的日期做准备的吗?
  • 在 PL/SQL 中,是的 - 使用任何你想要的循环。在 SQL 中,可以使用 CONNECT BY 和 LEVEL 伪列(您可以将 LEVEL 添加到某个开始日期)来完成“循环”(一种)。
  • 你能举个例子吗
  • 如果您的意思是“如何生成日期”,那么我编辑了答案并添加了一个示例。
  • 不不,我想要一个 for 循环,在 where 子句中给出日期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2021-09-19
相关资源
最近更新 更多