如何使用Oracle SQL从sysdate的月份获取所有日期?

时间:2015-07-16 18:50:43

标签: sql oracle

我尝试获取不带参数的查询,以获取当月的日期列表。

这样的事情:

  

SYSDATE = 16/07/15

我想要下一个清单:

  

01/07/15
  2015年7月2日   ......   2015年7月30日   31/07/15

4 个答案:

答案 0 :(得分:1)

选择当月的所有日期

SELECT  TO_CHAR (TRUNC (SYSDATE, 'MM'), 'YYYYMMDD')+(LEVEL - 1) each_date
FROM    DUAL a
CONNECT BY LEVEL < (TO_NUMBER (TO_CHAR (TRUNC (SYSDATE, 'MM') - 1, 'DD'))+1)

答案 1 :(得分:1)

这就是我的工作:

SELECT TRUNC(SYSDATE, 'MM') + LEVEL - 1 AS day
FROM dual
CONNECT BY TRUNC(TRUNC(SYSDATE, 'MM') + LEVEL - 1, 'MM') = TRUNC(SYSDATE, 'MM')
;

此查询中的关键是TRUNC(SYSDATE, 'MONTH'),这是当月的第一天 我们使用分层查询来将一天添加到该月的第一天,直到该值不再是当月 我们使用LEVEL - 1因为LEVEL从1开始,我们需要它从零开始。

以下是上述查询的伪查询:

SELECT (start_of_month + days) AS day
FROM dual
WHILE MONTH_OF(start_of_month + days) = current_month

此查询更容易理解:

SELECT *
FROM
(
    SELECT TRUNC(SYSDATE, 'MM') + LEVEL - 1 AS day
    FROM dual
    CONNECT BY LEVEL <= 32
)
WHERE EXTRACT(MONTH FROM day) = EXTRACT(MONTH FROM SYSDATE)

答案 2 :(得分:0)

这应该有效:

    select trunc(sysdate, 'MONTH') + rownum - 1
      from dual
connect by rownum <= to_number(to_char(last_day(sysdate), 'DD'));

答案 3 :(得分:0)

这是一个使用connect by的技巧。我在月份级别截断日期,有效地将其设置为月份的第1天,为每个“级别”添加一天,然后筛选在月外发生的任何一天。

select day_of_month
from
(select (level - 1) + trunc(to_date('07/16/2015','MM/DD/YYYY'),'MM') day_of_month
from
dual
connect by level <= 31)
where day_of_month < add_months(trunc(to_date('07/16/2015','MM/DD/YYYY'),'MM'),1);