如果日期范围涵盖整个特定月份

时间:2017-01-10 10:41:13

标签: sql oracle

我有一张基本表:

ID  datefrom   dateto
555 09-AUG-16  19-AUG-16
400 16-MAY-16  04-OCT-16
555 04-APR-16  29-JUL-16

我想在第6个月选择特定月份(年份并不重要)。

为此,我想在月份= 6时输出以下内容:

ID  datefrom   dateto    fullmonth
555 09-AUG-16  19-AUG-16 0
400 16-MAY-16  04-OCT-16 1
555 04-APR-16  29-JUL-16 1

它们的值为1,因为范围包含整月6月(6)。

2 个答案:

答案 0 :(得分:2)

假设datefromdateto具有DATE数据类型(否则使用TO_DATE()),然后在月内传递和日期值作为chosen_month绑定参数,你可以使用:

SELECT t.*,
       CASE WHEN datefrom <= TRUNC( :chosen_month, 'MM' )
            AND  dateto   >= ADD_MONTHS( TRUNC( :chosen_month, 'MM' ), 1 )
            THEN 1
            ELSE 0
       END AS fullmonth
FROM   table_name t

或者,将给定年份和月份作为数字传递,然后:

WITH chosen_date ( dt ) AS (
  SELECT TO_DATE(
           TO_CHAR( :chosen_year, '0000' )
           || TO_CHAR( :chosen_month, '00' )
           || '01',
           'YYYYMMDD'
         )
  FROM DUAL
)
SELECT t.*,
       CASE WHEN datefrom <= c.dt
            AND  dateto   >= ADD_MONTHS( c.dt, 1 )
            THEN 1
            ELSE 0
       END AS fullmonth
FROM   table_name t
       CROSS JOIN
       chosen_date c

或者,如果你想在第一年考虑它

SELECT t.*,
       CASE WHEN datefrom <= month_start
            AND  dateto   >= ADD_MONTHS( month_start, 1 )
            THEN 1
            ELSE 0
       END AS fullmonth
FROM   (
  SELECT t.*,
         ADD_MONTHS( TRUNC( datefrom, 'Y' ), :chosen_month - 1 ) AS month_start
  FROM   table_name t
) t

注意:如果您认为from=2016-02-01, to=2016-02-29涵盖整个月,请将ADD_MONTHS函数替换为LAST_DAY

答案 1 :(得分:0)

我使用TO_DATE函数生成一个月(当通过ODBC放入Excel文件时将进行参数化),以及在LAST_DAY语句中使用CASE函数。

SELECT ID, datefrom, dateto,
CASE WHEN datefrom <= TO_DATE('6/2016', 'MM/YYYY')
            AND  dateto   >= LAST_DAY(TO_DATE('6/2016', 'MM/YYYY'))
            THEN 1
            ELSE 0
       END AS fullmonth
FROM mytable

输出:

ID  datefrom   dateto    fullmonth
555 09-AUG-16  19-AUG-16 0
400 16-MAY-16  04-OCT-16 1
555 04-APR-16  29-JUL-16 1