我们有以下查询来获取1970-01-01的当前周数,但它写了一段时间,你能否告诉我为什么它从减去的日期减去3?
SELECT
TRUNC((to_number(sysdate-to_date('1970-01-01','YYYY-MM-DD'))-3)/7) week from dual
答案 0 :(得分:2)
如果您放入一系列天数:
查询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日 - 是方便的星期一。这使它成为一个方便的参考点。