簡體   English   中英

Oracle SQL:從日期中提取一年中的星期給出隨機結果

[英]Oracle SQL: Extracting the week of the year from date gives random results

我一直在使用以下語句從日期獲取一年中的星期幾:

TO_CHAR(TO_DATE(tbl.col,'YYYY/MM/DD'),'IW') AS week

現在我收到奇怪的結果,我似乎無法弄清楚。 對於以下日期,我將收到第24周的信息:

17年6月19日|| 2015年6月23日|| 2015年6月24日|| 2015年6月25日|| 17年6月29日|| 17年6月30日

為此,我收到25:

17年6月20日|| 17年6月21日|| 17年6月22日|| 2015年6月26日|| 17年6月27日|| 17年6月28日

...而且這還在繼續。 現在我所有的查詢都顯示不正確的數據,我有點擔心。 我現在才注意到的唯一原因是因為第26、27、30、31和32周沒有結果,而我的其他任何查詢都不是這種情況。

任何建議或指向可能的錯誤的指針,不勝感激。

謝謝!

[TL; DR]只需使用: TO_CHAR( tbl.col, 'IW' )

您有多個問題:

  1. 數據類型為“日期”

    您正在調用帶有DATE (不是VARCHAR2 )的TO_DATE( string, format_model ) ,這會導致Oracle使用NLS_DATE_FORMAT會話參數作為格式模型將DATE隱式轉換為VARCHAR2 ,從而可以將其轉換回DATE 因此,您實際上在做:

     TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' ) 

    不要這樣做 ,只需使用:

     TO_CHAR( tbl.col, 'IW' ) 

    如果這樣做,則以下問題無關緊要。

  2. 正如RealCheeseLord所指出的,格式模型中年和日的位置是相反的。
  3. 您正在使用YYYY作為年格式模型,因此所有年份都將在公元1世紀。

    范例

     SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL 

    輸出

     DT ---------- 0019-06-17 

    如果您不打算修復隱式字符串轉換,那么您可能會想要:

     TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week 

    或(取決於您希望99年是1999年還是2099年):

     TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week 
  4. 您正在將MM格式模型用於MON格式的數據-這不一定是問題,因為MM也與MONMONTH匹配,但是您可能應該使用正確的模型。

您的年月日順序錯誤。 那些星期是正確的,例如,2020年6月17日是第25周,2023年6月17日是第24周,依此類推。

嘗試: TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week

或者其他的東西

頁面底部的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM