用SQL語句得到指定日期所在的周是本年度第幾周
昨天,客戶提了一個需求,需求中有要用到求指定日期所在的周是本年度的第幾周
看到這個問題,我很自然的想到了to_char(d,'ww')這個用法:
SQL> select date'2010-01-1' + rownum - 1 r,
2 to_char(date'2010-01-1' + rownum - 1,'d')-1 wn,
3 to_number(to_char(date'2010-01-1' + rownum - 1,'ww')) nthweek
4 from dual
5 connect by rownum <= date'2010-01-27' - date'2010-01-1' + 1
6 /
R WN NTHWEEK
----------- ---------- ----------
2010-1-1 5 1
2010-1-2 6 1
2010-1-3 0 1
2010-1-4 1 1
2010-1-5 2 1
2010-1-6 3 1
2010-1-7 4 1
2010-1-8 5 2
2010-1-9 6 2
2010-1-10 0 2
2010-1-11 1 2
2010-1-12 2 2
2010-1-13 3 2
2010-1-14 4 2
2010-1-15 5 3
2010-1-16 6 3
2010-1-17 0 3
2010-1-18 1 3
2010-1-19 2 3
2010-1-20 3 3
2010-1-21 4 3
2010-1-22 5 4
2010-1-23 6 4
2010-1-24 0 4
2010-1-25 1 4
2010-1-26 2 4
2010-1-27 3 4
27 rows selected
從以上資料來看,第一組顏色是對應的真正的第一週,但這個函式卻把第一個7天作為了第一週,使得實際的第一週跟得到的第一週差了4天的時間,這四天直接導致了後面資料的不準確。貌似網上也沒有查到過直接可以解決這個問題的Oracle系統函式,沒辦法,只好自己寫了個SQL:
SQL> with tmp as(select date'2010-01-27' d from dual)
2 select r, wn,
3 sum(decode(wn, 1, 1, 0))over(order by rownum) +
4 decode(to_char(trunc(d, 'y') - 1, 'd'),1,1,1) nthweek
5 from (select trunc(d, 'y') + rownum - 1 r, d,
6 to_char(trunc(d, 'y') + rownum - 1, 'd') - 1 wn
7 from tmp
8 connect by rownum <= d - trunc(d, 'y') + 1)
9 /
R WN NTHWEEK
----------- ---------- ----------
2010-1-1 5 1
2010-1-2 6 1
2010-1-3 0 1
2010-1-4 1 2
2010-1-5 2 2
2010-1-6 3 2
2010-1-7 4 2
2010-1-8 5 2
2010-1-9 6 2
2010-1-10 0 2
2010-1-11 1 3
2010-1-12 2 3
2010-1-13 3 3
2010-1-14 4 3
2010-1-15 5 3
2010-1-16 6 3
2010-1-17 0 3
2010-1-18 1 4
2010-1-19 2 4
2010-1-20 3 4
2010-1-21 4 4
2010-1-22 5 4
2010-1-23 6 4
2010-1-24 0 4
2010-1-25 1 5
2010-1-26 2 5
2010-1-27 3 5
27 rows selected
這次,顯示的結果便是真正要求的第幾周了。
下面的指令碼是直接得到第幾周的:
with tmp as(select date'2010-01-27' d from dual)
select sum(1)+decode(to_char(t.d,'d'),1,1,1) nthweek
from (select to_char(trunc(d, 'y') + rownum - 1, 'd') - 1 nd
from tmp
connect by rownum <= d - trunc(d, 'y') + 1), tmp t
where nd = 1
實現的原理其實很簡單,即首先把當前所在日期的年的第一天取出,然後構造從第一天到改天的所有資料(最多也就366條),並把這些天都轉換成星期幾(與實際星期幾對應),最後把每個星期一都取出來進行累加,考慮到年初第一天可能不是週一,需要特殊處理外,其他直接相加即可
看到這個問題,我很自然的想到了to_char(d,'ww')這個用法:
SQL> select date'2010-01-1' + rownum - 1 r,
2 to_char(date'2010-01-1' + rownum - 1,'d')-1 wn,
3 to_number(to_char(date'2010-01-1' + rownum - 1,'ww')) nthweek
4 from dual
5 connect by rownum <= date'2010-01-27' - date'2010-01-1' + 1
6 /
R WN NTHWEEK
----------- ---------- ----------
2010-1-1 5 1
2010-1-2 6 1
2010-1-3 0 1
2010-1-4 1 1
2010-1-5 2 1
2010-1-6 3 1
2010-1-7 4 1
2010-1-8 5 2
2010-1-9 6 2
2010-1-10 0 2
2010-1-11 1 2
2010-1-12 2 2
2010-1-13 3 2
2010-1-14 4 2
2010-1-15 5 3
2010-1-16 6 3
2010-1-17 0 3
2010-1-18 1 3
2010-1-19 2 3
2010-1-20 3 3
2010-1-21 4 3
2010-1-22 5 4
2010-1-23 6 4
2010-1-24 0 4
2010-1-25 1 4
2010-1-26 2 4
2010-1-27 3 4
27 rows selected
從以上資料來看,第一組顏色是對應的真正的第一週,但這個函式卻把第一個7天作為了第一週,使得實際的第一週跟得到的第一週差了4天的時間,這四天直接導致了後面資料的不準確。貌似網上也沒有查到過直接可以解決這個問題的Oracle系統函式,沒辦法,只好自己寫了個SQL:
SQL> with tmp as(select date'2010-01-27' d from dual)
2 select r, wn,
3 sum(decode(wn, 1, 1, 0))over(order by rownum) +
4 decode(to_char(trunc(d, 'y') - 1, 'd'),1,1,1) nthweek
5 from (select trunc(d, 'y') + rownum - 1 r, d,
6 to_char(trunc(d, 'y') + rownum - 1, 'd') - 1 wn
7 from tmp
8 connect by rownum <= d - trunc(d, 'y') + 1)
9 /
R WN NTHWEEK
----------- ---------- ----------
2010-1-1 5 1
2010-1-2 6 1
2010-1-3 0 1
2010-1-4 1 2
2010-1-5 2 2
2010-1-6 3 2
2010-1-7 4 2
2010-1-8 5 2
2010-1-9 6 2
2010-1-10 0 2
2010-1-11 1 3
2010-1-12 2 3
2010-1-13 3 3
2010-1-14 4 3
2010-1-15 5 3
2010-1-16 6 3
2010-1-17 0 3
2010-1-18 1 4
2010-1-19 2 4
2010-1-20 3 4
2010-1-21 4 4
2010-1-22 5 4
2010-1-23 6 4
2010-1-24 0 4
2010-1-25 1 5
2010-1-26 2 5
2010-1-27 3 5
27 rows selected
這次,顯示的結果便是真正要求的第幾周了。
下面的指令碼是直接得到第幾周的:
with tmp as(select date'2010-01-27' d from dual)
select sum(1)+decode(to_char(t.d,'d'),1,1,1) nthweek
from (select to_char(trunc(d, 'y') + rownum - 1, 'd') - 1 nd
from tmp
connect by rownum <= d - trunc(d, 'y') + 1), tmp t
where nd = 1
實現的原理其實很簡單,即首先把當前所在日期的年的第一天取出,然後構造從第一天到改天的所有資料(最多也就366條),並把這些天都轉換成星期幾(與實際星期幾對應),最後把每個星期一都取出來進行累加,考慮到年初第一天可能不是週一,需要特殊處理外,其他直接相加即可
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-675027/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 獲取指定日期是當年第幾周,指定日期所在周的開始和結束日期
- java獲取指定日期所在周的 週一 和 週日Java
- 獲取當天是本月的第幾周
- 如何用shell得到集合中指定的第幾列第幾行的元素
- 日期與字串的互相轉換SQL語句字串SQL
- 試用「ChatGPT」幾周之後ChatGPT
- SQL Server 語句日期格式查詢方法SQLServer
- ThinkPHP 列印 sql 語句的幾種方式PHPSQL
- 判斷日期是該年的第幾天
- 第191場周賽
- 第 210 場周賽
- 神奇的周幾計算器
- 2018年第18周-Java語言思想-併發Java
- MySQL中特別實用的幾種SQL語句送給大家MySql
- LeetCode第215場周賽LeetCode
- 第3周10.12-10.18
- 2018第12周總結
- AcWing第85場周賽
- MySQL關於根據日期查詢資料的sql語句MySql
- Mysql日期常用語句MySql
- Vue無限滑動周選擇日期的元件Vue元件
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- 人工智慧第2周(SVM)人工智慧
- 隨堂練習第7周
- 第11周個人練習
- 第11周小組練習
- leetcode 第 217 場周賽(vivo)LeetCode
- SQL語句SQL
- SQL語句IN的用法SQL
- ACCESS2016 SQL語句應用SQL
- MySQL資料庫中SQL語句分幾類?MySql資料庫
- 一條update SQL語句是如何執行的SQL
- 一條SQL更新語句是如何執行的SQL
- 一條SQL更新語句是如何執行的?SQL
- 一條更新的SQL語句是如何執行的?SQL
- 左耳聽風打卡.ARTS (第2周)
- 第11周團隊共同完成
- 左耳聽風.ARTS 打卡 (第6周)
- 左耳聽風打卡.ARTS (第5周)