我尝试获取不带参数的查询,以获取当月的日期列表。
这样的事情:
SYSDATE = 16/07/15
我想要下一个清单:
01/07/15
2015年7月2日 ...... 2015年7月30日 31/07/15
答案 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);