【发布时间】:2017-01-09 12:24:49
【问题描述】:
我想问您如何从 Oracle SQL 的日期范围 (DD-MON-YY) 中获取特定日期 (DD-MON) 的计数? 这就是我所拥有的:
MEMBERS INSTALL_D DOB SYSDATE
6934109 22-FEB-12 18-NOV 09-JAN-17
6934109 22-FEB-12 13-JUN 09-JAN-17
6934109 22-FEB-12 12-AUG 09-JAN-17
6934109 22-FEB-12 24-OCT 09-JAN-17
6934109 22-FEB-12 04-FEB 09-JAN-17
我想从日期 INSTALL_D 和 SYSDATE 的范围内计算 DOB。比方说
- 18-NOV 行出现 5 次,
- 13-JUN 的行出现了 5 次,
- 12-AUG 行出现 5 次,
- 24-OCT 的行出现 5 次
最后一个只有4次。
所以,结果应该是这样的:
MEMBERS INSTALL_D DOB SYSDATE COUNT(DOB)
6934109 22-FEB-12 18-NOV 09-JAN-17 5
6934109 22-FEB-12 13-JUN 09-JAN-17 5
6934109 22-FEB-12 12-AUG 09-JAN-17 5
6934109 22-FEB-12 24-OCT 09-JAN-17 5
6934109 22-FEB-12 04-FEB 09-JAN-17 4
我尝试使用 MONTHS_BETWEEN 函数,但这不是我想要的。
编辑:
我会更具体。我使用这个查询来获取上面的第一个表:select B0022HOME_NO as Members,
B0022INSTALLDATE as INSTALL_DATE,
to_char(to_date (encryption.decrypt(a.B0031MEMDATEOFBIRT),'DD-MON-YYYY'),'DD-MON')as DOB,
SYSDATE
from BT0022, BT0031 a
where B0022HOME_NO=a.B003101HOME_NO and BT0022.B0022HOME_NO=6934109;
INSTALL_D 是安装日期,在这个例子中是 22-FEB-12 DOB 是会员的生日。只有日期和月份 (DD-MON)SYSDATE 是实际日期。
假设 sysdate 是 18-NOV-12 并且 INSTALL_D 是 22-FEB-12 并且成员的 DOB 是 18-NOV,这意味着 DOB 在这个日期范围内出现一次。
例如:INSTALL_D 22-FEB-12 and SYSDATE 09-JAN-17 is DOB of 18-NOV 出现 5 次,但如果 SYSDATE 为 18-NOV-17,则为 6 次。这就是我问你关于日期范围内的 count(DOB) 的问题。
提前致谢
【问题讨论】:
-
列数据类型?您使用的是哪个 dbms?
-
INSTALL_D 列是 DATE 类型,DOB 是 varchar2。 DBMS 是 Oracle 数据库 10g 版本 10.2.0.1.0 - 64 位
-
此设置存在严重问题。为什么“SYSDATE”是该表中的一列? SYSDATE 是一个系统函数,它的值是动态计算的,它不存储在表中。您是要使用 SYSDATE(但表中没有相应的列),还是要使用不应称为“SYSDATE”的存储日期?然后-您是不是要更改 MEMBERS 列,以便在所有行中都没有相同的值? (我不认为同一个成员有不同的出生日期)。另外,为什么 DOB 存储为 VARCHAR2,而不是日期(包括年份)?
-
SYSDATE 不必在那里。我的意思是第一个选项:表中没有列,只使用 SYSDATE。我不知道为什么 DOB 存储为 VARCHAR2。我开始使用这种类型的系统。我无法改变它。在这个特定的例子中,我不需要知道 DOB 的年份。
标签: sql oracle count date-range