我想问您如何从Oracle中获得特定日期(DD-MON)的日期范围(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。比方说
最后一次只有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-2月12日。
DOB是会员的生日。只有日月(DD-MON)
SYSDATE用于实际日期。
比方说,如果系统是18日-11月12日,INSTALL_D是22-2月12日,成员道布是18-11月,那就意味着道布在这个日期范围内发生了一次。
例如: INSTALL_D 22-2月12日和SYSDATE 09-1月17日是道布的18-11月发生5次,但如果SYSDATE为18-11月17日,则为6次.这就是我问你关于日期范围内的道布伯爵的问题。
提前感谢
发布于 2017-01-09 14:57:12
这里还有另一种方法,希望能与发生在闰年的道布合作:
(N.b.我假设你所有的日期都是以日期的形式存储的,这意味着你的道布专栏有很多年。如果不是这样的话,那你为什么不和道布一起储存这一年呢?( b)您必须更新我的查询,将字符串转换为适合比较的格式)
WITH sample_data AS (SELECT 6934109 members, to_date('22/02/2012', 'dd/mm/yyyy') install_d, to_date('18/11/1969', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934109 members, to_date('22/02/2012', 'dd/mm/yyyy') install_d, to_date('13/06/1991', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934109 members, to_date('22/02/2012', 'dd/mm/yyyy') install_d, to_date('12/08/1982', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934109 members, to_date('22/02/2012', 'dd/mm/yyyy') install_d, to_date('24/10/1963', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934109 members, to_date('22/02/2012', 'dd/mm/yyyy') install_d, to_date('04/02/1975', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934110 members, to_date('28/02/2011', 'dd/mm/yyyy') install_d, to_date('29/02/1976', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934110 members, to_date('29/02/2012', 'dd/mm/yyyy') install_d, to_date('01/03/1975', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934111 members, to_date('01/01/2017', 'dd/mm/yyyy') install_d, to_date('12/01/1957', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934111 members, to_date('01/01/2017', 'dd/mm/yyyy') install_d, to_date('02/01/1980', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934112 members, to_date('01/03/2011', 'dd/mm/yyyy') install_d, to_date('29/02/1976', 'dd/mm/yyyy') dob FROM dual UNION ALL
SELECT 6934112 members, to_date('29/02/2012', 'dd/mm/yyyy') install_d, to_date('29/02/1976', 'dd/mm/yyyy') dob FROM dual)
SELECT members,
install_d,
dob,
SYSDATE,
date_of_first_year,
date_of_latest_year,
months_between(date_of_latest_year, date_of_first_year)/12 + 1 count_birthdays
FROM (SELECT members,
install_d,
dob,
SYSDATE,
CASE WHEN to_char(dob, 'mmdd') < to_char(install_d, 'mmdd') THEN
trunc(add_months(install_d, 12), 'yyyy')
ELSE trunc(install_d, 'yyyy')
END date_of_first_year,
CASE WHEN to_char(dob, 'mmdd') <= to_char(SYSDATE, 'mmdd') THEN
trunc(SYSDATE, 'yyyy')
ELSE add_months(trunc(SYSDATE, 'yyyy'), -12)
END date_of_latest_year
FROM sample_data);
MEMBERS INSTALL_D DOB SYSDATE DATE_OF_FIRST_YEAR DATE_OF_LATEST_YEAR COUNT_BIRTHDAYS
---------- ----------- ----------- ----------- ------------------ ------------------- ---------------
6934109 22/02/2012 18/11/1969 09/01/2017 01/01/2012 01/01/2016 5
6934109 22/02/2012 13/06/1991 09/01/2017 01/01/2012 01/01/2016 5
6934109 22/02/2012 12/08/1982 09/01/2017 01/01/2012 01/01/2016 5
6934109 22/02/2012 24/10/1963 09/01/2017 01/01/2012 01/01/2016 5
6934109 22/02/2012 04/02/1975 09/01/2017 01/01/2013 01/01/2016 4
6934110 28/02/2011 29/02/1976 09/01/2017 01/01/2011 01/01/2016 6
6934110 29/02/2012 01/03/1975 09/01/2017 01/01/2012 01/01/2016 5
6934111 01/01/2017 12/01/1957 09/01/2017 01/01/2017 01/01/2016 0
6934111 01/01/2017 02/01/1980 09/01/2017 01/01/2017 01/01/2017 1
6934112 01/03/2011 29/02/1976 09/01/2017 01/01/2012 01/01/2016 5
6934112 29/02/2012 29/02/1976 09/01/2017 01/01/2012 01/01/2016 5如果你想让2月29日的道布和非闰年的3月1日相匹配,那么软膏中唯一的苍蝇就会发生。
我上面的问题中没有这种逻辑,但您可以在install_d和sysdate年的2月最后一天加一个检查,如果是第28天,那么在进行比较之前,将'29/02‘的道布改为'01/03’。(即将2012年2月29日的install_d与道布= 29/02相比较,因为2012年是闰年。您不需要比较sysdate,因为0301 >= 0229和0228 < 0229,不考虑sysdate是否是闰年。)
发布于 2017-01-09 12:36:28
您可以按日期分段分组,这不是最漂亮的事情,但会工作的。例如:
GROUP BY CAST(DATEPART(mm, dob) AS VARCHAR(2)) + '-' + CAST(DATEPART(yyyy, dob) AS VARCHAR(4))您还可以将其放在select语句中。
发布于 2017-01-09 12:39:51
试一试:(按组应工作)
SELECT MEMBERS,INSTALL_D,DOB,SYSDATE,Count(DOB) FROM table_name GROUP BY DOB ,MEMBERS,INSTALL_D ,SYSDATEhttps://stackoverflow.com/questions/41548039
复制相似问题