计算时间段内的特定日期

时间:2014-09-18 16:02:42

标签: oracle function date

我试图在一个月内找到Xdays(星期一,星期五等)的数量。我总是可以在一个月内完成几天,找到他们的一周,总结并存储它,但我认为有更好的方法可以做到这一点。

理想情况下,我想在2015年9月的星期一,星期二和星期五(或任何日期)获得多少结果?"。

我可以找到如何在一段时间内获得工作日。我可以从已经输入数据库的日期中获得此类信息,但我想知道那里是星期二,即使那天没有数据。

5 个答案:

答案 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)

@Leeish说:

  

“你可能会编写一个脚本来检查第一天的内容   月份是,月份是多少天,并从中推断出来   有“

(我只能访问MS Sql但应该类似)

这将以文本格式(例如“星期一”)为您提供月份的第一天:

SELECT DATENAME(dw,DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))

这将告诉你这个月有多少天:

select datediff(d,  GETDATE(), dateadd(m, 1,  GETDATE()))

希望这会有所帮助。