对于给定的年份间隔,获取一年中每周的天数(星期一、星期二、网络、...、太阳)

Posted

技术标签:

【中文标题】对于给定的年份间隔,获取一年中每周的天数(星期一、星期二、网络、...、太阳)【英文标题】:For a given interval of years to get the number of days per week(mon, tue, web,...,sun) of the year 【发布时间】:2012-05-08 07:17:41 【问题描述】:

我想为此“在给定的年份间隔内获得一年中每周(周一、周二、网络、...、周日)的天数”的所有解决方案

有人知道其他答案吗?请分享;)

这是我的查询:)

WITH dat AS
(SELECT &&start_year + level - 1 cur_year, DECODE(MOD(&start_year + level - 1, 4), 0, 0, 1) no_leap, 
TO_NUMBER(TO_CHAR(TO_DATE('01.01.'||TO_CHAR(&start_year + level - 1)), 'D')) d
FROM dual
CONNECT BY LEVEL < &end_year - &start_year + 2)
SELECT cur_year,
51 + DECODE(no_leap, 1, DECODE(d, 1, 2, 1), DECODE(d, 1, 2, 7, 2, 1)) mon,
51 + DECODE(no_leap, 1, DECODE(d, 2, 2, 1), DECODE(d, 2, 2, 1, 2, 1)) tue,
51 + DECODE(no_leap, 1, DECODE(d, 3, 2, 1), DECODE(d, 3, 2, 2, 2, 1)) wed,
51 + DECODE(no_leap, 1, DECODE(d, 4, 2, 1), DECODE(d, 4, 2, 3, 2, 1)) thu,
51 + DECODE(no_leap, 1, DECODE(d, 5, 2, 1), DECODE(d, 5, 2, 4, 2, 1)) fri,
51 + DECODE(no_leap, 1, DECODE(d, 6, 2, 1), DECODE(d, 6, 2, 5, 2, 1)) sat,
51 + DECODE(no_leap, 1, DECODE(d, 7, 2, 1), DECODE(d, 7, 2, 6, 2, 1)) sun
FROM dat;

【问题讨论】:

【参考方案1】:

您应该利用 Oracle 的日期算术。当您将两个日期相减时,将返回一个数字,即两个日期之间的天数。如果没有整数差,则返回实际差:

SQL> select sysdate - to_date('20120504 15', 'yyyymmdd hh24') from dual;

SYSDATE-TO_DATE('2012050415','YYYYMMDDHH24')
--------------------------------------------
                                  3.76489583

请注意,这不包括timestamp,仅包括date 数据类型。执行timestamp 算术返回interval 数据类型。

大多数解决方案是

with dates as ( 
  select to_char(to_date('&start_year','yyyy') + level, 'fmDAY') as days
    from dual
  connect by level < to_date('&end_year','yyyy') - to_date('&start_year','yyyy')
          )
  select ...

注意格式模型的fm modifier;这将删除尾随空格。

作为一般规则,在处理日期时,最好使用日期,而不是数字或字符。您的connect by 子句CONNECT BY LEVEL &lt; &amp;end_year - &amp;start_year + 2,虽然很简单,但您需要做很多额外的工作才能使您的解决方案发挥作用。

【讨论】:

嗨 Ben,您的查询只返回区间 year[start_year, end_year] 中的天数。但我需要返回每年的天数(每周)。

以上是关于对于给定的年份间隔,获取一年中每周的天数(星期一、星期二、网络、...、太阳)的主要内容,如果未能解决你的问题,请参考以下文章

js获两个时间间隔天数 除星期天

Linux之cal命令

LocalDate 解析抛出异常‽

输入年份,月份,日期计算该日期是一年中的第几天//雪碧和可乐temp

用 Javascript 获取一周中的天数,一周从星期日开始

如何使用swift找到给定月份和年份的天数