【问题标题】:If a date range covers a whole specific month如果日期范围涵盖整个特定月份
【发布时间】:2017-01-10 19:32:18
【问题描述】:

我有一张基本表:

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)。

【问题讨论】:

  • 逻辑还是不清楚
  • @Rahul ive 添加了更多内容。
  • 您的 datefromdateto 似乎是 varchar。如果是这样,请不要这样做!
  • @TimBiegeleisen 无法更改数据类型,数据库不可编辑。
  • 假设你有 dateFrom = 15/01/2016 和 dateTo = 16/01/2017?一月是否应该被视为包含在内?

标签: sql oracle


【解决方案1】:

假设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

【讨论】:

  • ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER
  • 对于选择的月份,我想输入一位数或两位数,例如6 或 12 等
  • 6 可以是月份和年份的索引,但 6 本身并不是月份。如果你想指定一个月,那么你需要给出一个月和一年(或者,正如我使用的那样,该月内的日期)。否则,将要求更改为您希望它是任何年的整月 - 这是一个完全不同的问题。
  • 我做了“(年份无所谓)”
  • @Matt 添加了一些其他选项
【解决方案2】:

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

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

【讨论】:

  • 这是我的部分答案的副本。
  • 随意将我的答案复制并粘贴到您的答案中,然后删除这个:)
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多