Oracle 计算时间段中一周的特定天数

Oracle 计算时间段中一周的特定天数,oracle,function,date,Oracle,Function,Date,我试图找出一个月内星期一、星期五等的天数。我总是可以在一个月内循环几天,找到他们一周中的哪一天,总结并存储,但我认为有更好的方法来做到这一点 理想情况下,我希望得到2015年9月有多少个周一、周二、周五或其他日子的结果 我可以找到如何在一段时间内获得周天数。我可以从数据库中输入的日期中获取此类信息,但我想知道有一个星期二,即使没有那天的数据 正如@Leeish所说: 您可能会编写一个脚本来检查 月份是,月份中有多少天,并根据 那里 我只能访问MS Sql,但应该与之类似 这将以文本格式“星期一”

我试图找出一个月内星期一、星期五等的天数。我总是可以在一个月内循环几天,找到他们一周中的哪一天,总结并存储,但我认为有更好的方法来做到这一点

理想情况下,我希望得到2015年9月有多少个周一、周二、周五或其他日子的结果

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

正如@Leeish所说:


您可能会编写一个脚本来检查 月份是,月份中有多少天,并根据 那里

我只能访问MS Sql,但应该与之类似

这将以文本格式“星期一”显示每月的第一天,例如:

SELECT DATENAME(dw,DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))
这将显示一个月有多少天:

select datediff(d,  GETDATE(), dateadd(m, 1,  GETDATE()))
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'

希望这能有所帮助。

在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'
       ;

Michiel T答案的变体,使用trunc和month format参数获取月份的第一天:

select datediff(d,  GETDATE(), dateadd(m, 1,  GETDATE()))
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'

基于PL/SQL的迭代方法:

基本用法:

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');
举个例子:

SELECT DATENAME(dw,DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))
2015年9月有多少周一、周二、周五或其他日子

制作:

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

这将为您提供给定月份的第一个星期二:

NEXT_DAY(TRUNC(DATE '2014-09-19', 'MM')-1, 'TUESDAY')
NEXT_DAY(LAST_DAY(DATE '2014-09-19')-7, 'TUESDAY')
这将为您提供给定月份的最后一个星期二:

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;

您可能会编写一个脚本来检查一个月的第一天是什么,以及该月有多少天,并从中推断。DATEDIFF、DATENAME、GETDATE不是Oracle函数。您可能希望检查所有天的情况。它没有给出2014年9月周一的正确答案。