我试图在一个月内找到Xdays(星期一,星期五等)的数量。我总是可以在一个月内完成几天,找到他们的一周,总结并存储它,但我认为有更好的方法可以做到这一点。
理想情况下,我想在2015年9月的星期一,星期二和星期五(或任何日期)获得多少结果?"。
我可以找到如何在一段时间内获得工作日。我可以从已经输入数据库的日期中获得此类信息,但我想知道那里是星期二,即使那天没有数据。
答案 0 :(得分:1)
Michiel T的答案的变体,使用带有月份格式参数的trunc
来获取该月的第一天:
select count(*)
from
(select trunc(sysdate, 'MM') + (level - 1) dt
from dual
connect by level <= extract(day from last_day(trunc(sysdate, 'MM'))))
where to_char(dt, 'FMDAY') = 'MONDAY'
答案 1 :(得分:1)
迭代方法,基于PL / SQL PIPELINED
functions:
CREATE OR REPLACE TYPE days_tbl AS TABLE OF DATE;
CREATE OR REPLACE FUNCTION days_for_month(basedate IN DATE)
RETURN days_tbl PIPELINED
AS
month VARCHAR(2);
thedate DATE := TRUNC(basedate,'MON');
BEGIN
LOOP
PIPE ROW(thedate);
EXIT WHEN thedate = LAST_DAY(thedate);
thedate := thedate + 1;
END LOOP;
END;
基本用法:
SELECT COLUMN_VALUE
FROM TABLE(days_for_month(SYSDATE))
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') = 'MONDAY';
该功能可能已针对您的特定需求进行了优化(按名称查找给定日期),但保持其更通用允许一些使用灵活性,如:
SELECT COLUMN_VALUE
FROM TABLE(days_for_month(SYSDATE))
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') IN ('SUNDAY','SATURDAY');
鉴于你的例子:
&#34; 2015年9月的星期一,星期二和星期五(或任何日子)有多少?&#34;。
SELECT COUNT(*)
FROM TABLE(days_for_month(TO_DATE('09-2015','MM-YYYY')))
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') IN ('MONDAY','TUESDAY','FRIDAY');
产:
COUNT(*)
13
或者如果您需要详细信息:
SELECT T.D, COUNT(*)
FROM TABLE(days_for_month(TO_DATE('09-2015','MM-YYYY'))),
(SELECT 'MONDAY' AS D FROM DUAL UNION
SELECT 'TUESDAY' FROM DUAL UNION
SELECT 'FRIDAY' FROM DUAL) T
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') = T.D
GROUP BY T.D
生产:
D COUNT(*)
TUESDAY 5
FRIDAY 4
MONDAY 4
答案 2 :(得分:0)
这将为您提供给定月份的第一个星期二:
NEXT_DAY(TRUNC(DATE '2014-09-19', 'MM')-1, 'TUESDAY')
这将为您提供给定月份的最后一个星期二:
NEXT_DAY(LAST_DAY(DATE '2014-09-19')-7, 'TUESDAY')
所以你可以把它结合起来:
SELECT 1 + (NEXT_DAY(LAST_DAY(DATE '2014-09-19')-7, 'TUESDAY') - NEXT_DAY(TRUNC(DATE '2014-09-19', 'MM')-1, 'TUESDAY'))/7 AS TUESDAYS_IN_MONTH
FROM dual;
答案 3 :(得分:-1)
在Oracle中,您可以使用日期格式掩码查看特定日期的日期。以下示例计算2015年第9个月(9月)的所有星期一
SELECT COUNT(*)
FROM ( SELECT RTRIM(TO_CHAR(TO_DATE(TO_CHAR(LEVEL, '09')||'09'||'2015','DDMMYYYY'),'DAY')) AS days
FROM dual
WHERE ROWNUM <= EXTRACT(DAY FROM LAST_DAY(TO_DATE('09'||'2015','MMYYYY')))
CONNECT BY LEVEL=ROWNUM
)
WHERE days = 'MONDAY'
;
答案 4 :(得分:-2)
“你可能会编写一个脚本来检查第一天的内容 月份是,月份是多少天,并从中推断出来 有“
(我只能访问MS Sql但应该类似)
这将以文本格式(例如“星期一”)为您提供月份的第一天:
SELECT DATENAME(dw,DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))
这将告诉你这个月有多少天:
select datediff(d, GETDATE(), dateadd(m, 1, GETDATE()))
希望这会有所帮助。