我有一张基本表:
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)。
答案 0 :(得分:2)
假设datefrom
和dateto
具有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