用于查找周的Oracle查询

时间:2017-10-03 12:13:02

标签: sql oracle

我们有以下查询来获取1970-01-01的当前周数,但它写了一段时间,你能否告诉我为什么它从减去的日期减去3?

SELECT
TRUNC((to_number(sysdate-to_date('1970-01-01','YYYY-MM-DD'))-3)/7) week from dual

2 个答案:

答案 0 :(得分:2)

如果您放入一系列天数:

SQL Fiddle

查询1

SELECT TRUNC((to_number(dt-to_date('1970-01-01','YYYY-MM-DD'))-3)/7)
         week,
       TO_CHAR( dt, 'DY YYYY-MM-DD' ) AS day
FROM ( SELECT TRUNC( SYSDATE, 'IW' ) + LEVEL - 1 AS dt
       FROM   DUAL
       CONNECT BY LEVEL <= 7 )

<强> Results

| WEEK |            DAY |
|------|----------------|
| 2491 | MON 2017-10-02 |
| 2491 | TUE 2017-10-03 |
| 2491 | WED 2017-10-04 |
| 2491 | THU 2017-10-05 |
| 2491 | FRI 2017-10-06 |
| 2491 | SAT 2017-10-07 |
| 2492 | SUN 2017-10-08 |

查询将日期转换为星期一,而是将差异减少3,从而有效地计算当前日期与1970年1月4日星期日之间的整周数。

查询的简化版本为:

SELECT TRUNC( ( SYSDATE - DATE '1970-01-04' ) / 7 ) AS Week
FROM   DUAL;

或更能解释&#34;魔法&#34;日期:

SELECT TRUNC( ( SYSDATE - NEXT_DAY( DATE '1970-01-01', 'SUNDAY' ) ) / 7 ) AS Week
FROM   DUAL;

答案 1 :(得分:1)

1970-01-01是星期四。

减去三天的目的是将一周的开始时间移至星期一。

作为一个说明,当前千禧年的第一天 - 2001年1月1日 - 是方便的星期一。这使它成为一个方便的参考点。