两个日期之间的特定天数

Posted

技术标签:

【中文标题】两个日期之间的特定天数【英文标题】:Number of particular days between two dates 【发布时间】:2013-05-03 11:34:33 【问题描述】:

是否有一种“简单”的方法来计算两个日期之间特定日期的计数(例如,假设我想知道 2000 年 1 月 1 日和今天之间的星期二数)?此外,同样的问题更广泛地适用于不同的单位(例如,两个日期之间有多少个下午 2 点,有多少个 2 月,有多少个 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 函数可以在特定月份使用。我还应该了解其他任何相关功能吗?

【问题讨论】:

查看 docs.oracle.com/cd/E11882_01/server.112/e26088/… 获取 Oracle 日期函数列表。 为自己建立一个Calendar table,所有的约会问题都会消失。 【参考方案1】:

用您的日期替换开始/结束日期。此查询计算了从 2013 年 1 月 1 日到今天的 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' -- 
/

【讨论】:

谢谢,但这与我的查询有何不同?您只是使用子查询而不是 CTE。 没有区别。你所谓的 CTE 或我的查询。在发布我的查询之前,我没有检查您的查询。我的查询有更多日期来测试和查看实际日期,以及工作日等...选择任何一个来创建视图。这再简单不过了。

以上是关于两个日期之间的特定天数的主要内容,如果未能解决你的问题,请参考以下文章

(Java / Android) 计算两个日期之间的天数并以特定格式呈现结果

如果 DATE 具有特定格式(NOT DATE),则返回两个日期之间的天数

计算两个日期之间的特定日期计数

C++ 计算两个日期之间的天数

c#如何计算两个日期之间相隔天数

java计算两个日期之间的天数