2013-05-03 117 views
2

是否有一种“简单”的方法来计算两个日期之间某一天的计数(例如,我想知道2000年1月1日至今的星期二的数量)?此外,同样的问题更广泛地适用于不同的单位(例如,两个日期之间有多少2pms,Februaries有多少,8月21日有多少等等)......我最好的想法是,是这样的:两个日期之间的特定日期的数量

with calendar as (
    select  to_char(:start + level - 1, 'DAY') dayOfWeek 
    from  dual 
    connect by level <= ceil(:end - :start) 
) 
select dayOfWeek, count(dayOfWeek) 
from  calendar 
group by dayOfWeek; 

我将不得不创建一个视图 - 硬编码的开始和结束日期 - 使它方便(ish)使用;或者写一个函数来完成肮脏的工作。那会不会是困难的,但我不知道是否已经有一个Oracle功能,可以做到这一点,占之类的飞跃天等


编辑This的相关链接时弹出我发布了这个。这或多或少地回答了几天的问题,我知道在某些月份我可以使用months_between函数。任何其他我应该知道的相关功能?

+1

见http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions002.htm#i88891有关Oracle日期函数的列表。 – 2013-05-03 12:39:35

+1

建立一个[日历表](http://www.perpendulum.com/2012/06/calendar-table-script-for-oracle/),你所有的日期问题都会消失。 – GarethD 2013-05-03 12:58:29

回答

1

用您的日期替换开始/结束日期。从一月1-2013 TUE的这个查询计算的数量发展到今天,它是18:

SELECT count(*) number_of_tue 
    FROM 
(
SELECT TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL-1 start_dt 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'DY') wk_day 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'D') wk_day# 
     , trunc(Sysdate) end_dt 
    FROM DUAL 
CONNECT BY LEVEL <= trunc(Sysdate) - trunc(Sysdate, 'YEAR') -- replace with your start/end dates 
) 
WHERE wk_day# = 3 -- OR wk_day = 'TUE' -- 
/
+0

谢谢,但这与我的查询有何不同?你只是使用子查询而不是CTE。 – Xophmeister 2013-05-03 13:07:18

+0

没有差异。你称之为CTE或我的查询。在发布我的邮件之前,我没有检查您的查询。我的查询有更多的日期来测试并查看实际日期和星期几等...选择任何一个来创建视图。这不可能比这更容易。 – Art 2013-05-03 13:29:47

相关问题