首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中计算日期范围中的特定日期

在SQL中计算日期范围中的特定日期
EN

Stack Overflow用户
提问于 2017-01-09 12:24:49
回答 3查看 1.1K关注 0票数 1

我想问您如何从Oracle中获得特定日期(DD-MON)的日期范围(DD-MON)的计数?这就是我所拥有的:

代码语言:javascript
复制
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。比方说

  1. 和18-11月出现5次,
  2. 和13-6月出现了5次,
  3. 8月12日-8月5次出现,
  4. 24-10月的行是5次。

最后一次只有4次。

因此,结果应该是:

代码语言:javascript
复制
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次.这就是我问你关于日期范围内的道布伯爵的问题。

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-09 14:57:12

这里还有另一种方法,希望能与发生在闰年的道布合作:

(N.b.我假设你所有的日期都是以日期的形式存储的,这意味着你的道布专栏有很多年。如果不是这样的话,那你为什么不和道布一起储存这一年呢?( b)您必须更新我的查询,将字符串转换为适合比较的格式)

代码语言:javascript
复制
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是否是闰年。)

票数 1
EN

Stack Overflow用户

发布于 2017-01-09 12:36:28

您可以按日期分段分组,这不是最漂亮的事情,但会工作的。例如:

代码语言:javascript
复制
GROUP BY CAST(DATEPART(mm, dob) AS VARCHAR(2)) + '-' + CAST(DATEPART(yyyy, dob) AS VARCHAR(4))

您还可以将其放在select语句中。

票数 0
EN

Stack Overflow用户

发布于 2017-01-09 12:39:51

试一试:(按组应工作)

代码语言:javascript
复制
SELECT MEMBERS,INSTALL_D,DOB,SYSDATE,Count(DOB) FROM table_name GROUP BY  DOB ,MEMBERS,INSTALL_D  ,SYSDATE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41548039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档