![](/img/trans.png)
[英]Getting a date for "start of the week", from week and year numbers on 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' )
您有多個問題:
數據類型為“日期”
您正在調用帶有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' )
如果這樣做,則以下問題無關緊要。
您正在使用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
您正在將MM
格式模型用於MON
格式的數據-這不一定是問題,因為MM
也與MON
和MONTH
匹配,但是您可能應該使用正確的模型。
您的年月日順序錯誤。 那些星期是正確的,例如,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.