用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 獲取指定日期是當年第幾周,指定日期所在周的開始和結束日期
- Swift 3 獲取當前日期是第幾周Swift
- java獲取指定日期所在周的 週一 和 週日Java
- mysql按年度、季度、月度、周、日統計查詢的sql語句MySql
- 如何用shell得到集合中指定的第幾列第幾行的元素
- 神奇的周幾計算器
- ABAP日期函式(求月末日,第幾周,search help 只顯示年月) 使用方法例項函式
- 第11周個人練習
- 日期與字串的互相轉換SQL語句字串SQL
- SQL Server 語句日期格式查詢方法SQLServer
- 實用的SQL語句~!SQL
- ThinkPHP 列印 sql 語句的幾種方式PHPSQL
- 用sql語句建立表的時候給列指定說明(轉)SQL
- 人工智慧第2周(SVM)人工智慧
- 第0周學習總結
- 隨堂練習第7周
- 第11周小組練習
- 幾周內搞定Java的10個方法Java
- js計算指定日期幾天前或者幾天後的日期JS
- 幾個定位、查詢session的sql語句SessionSQL
- 第11周-可著色介面Colorable類
- 第11周-八邊形Octagon類Go
- 第11周團隊共同完成
- 第5周 5.2 迴圈結構
- 2018年第18周-Java語言思想-併發Java
- MySQL中特別實用的幾種SQL語句送給大家MySql
- 用動態SQL語句SQL
- 透過sql語句建立表時指定表空間的語法SQL
- Oracle AWR中常用到的幾個SQL語句OracleSQL
- Mysql日期常用語句MySql
- 計算2個日期間有多少個自然周
- 第3周 3.2 資料型別1資料型別
- 第九周 - MySQL 周作業MySql
- 東北公司使用新套件將幾周變成幾天套件
- MySQL關於根據日期查詢資料的sql語句MySql
- SQL(Structured Query Language)語句分哪幾類SQLStruct
- 用EXPLAIN PLAN 分析SQL語句AISQL
- SQL Server FOR XML PATH 語句的應用SQLServerXML