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