[英]How do you get the correct ISO week number from a date using Oracle Sql
我已經嘗試使用以下代碼來提取今年的正確iso周數,例如07/01/2019使用以下代碼,但它仍然返回一個星期數,這是一個日歷而不是基於iso,即第1周而不是第2周。老實說,有點難過。 NLS_TERRITORY設置為英國,如果這有任何區別?
to_number(to_char(to_date(date_created,'DD/MM/YYYY'),'IW')) as WEEK_PRODUCED
提前感謝您提供的任何幫助。
這似乎是因為隱式日期轉換 - 假設date_created
實際上是DATE
列而不是字符串。 如果您的NLS設置被設置為顯示具有2位數年份的日期,例如仍為默認的'DD-Mon-RR'
格式,那么您將日期值轉換為字符串然后再返回將失去世紀。 作為演示,通過CTE提供您的日期值:
alter session set nls_date_format = 'DD-Mon-RR';
with your_table (date_created) as (
select date '2019-01-07' from dual
)
select
to_char(date_created) as nls_date,
to_char(date_created, 'YYYY-MM-DD') as iso_date,
to_char(to_date(to_char(date_created), 'DD/MM/YYYY'), 'YYYY-MM-DD') as conv_date,
to_number(to_char(to_date(date_created,'DD/MM/YYYY'),'IW')) as WEEK_PRODUCED
from your_table;
NLS_DATE ISO_DATE CONV_DATE WEEK_PRODUCED
--------- ---------- ---------- -------------
07-Jan-19 2019-01-07 0019-01-07 1
請注意, conv_date
已使用NLS 2位數年份模型轉換為字符串,然后使用4位數年份模型返回日期,已經失去了它的世紀; 你對文字看起來是一樣的:
select to_char(to_date('01/07/19', 'DD/MM/YYYY'), 'YYYY-MM-DD') from dual;
TO_CHAR(TO
----------
0019-07-01
因為19歲,19歲; 這里沒有暗示或機制來假設你的意思是本世紀。 (這就是RRRR
格式模型的用途。)
因此,您將獲得19周年1月7日的ISO周數,而不是2019年,並且在那一年它是ISO第1周。
如果你的會話有一個4位數的年份模型,那么它會起作用:
alter session set nls_date_format = 'DD/MM/YYYY';
with your_table (date_created) as (
select date '2019-01-07' from dual
)
select
to_char(date_created) as nls_date,
to_char(date_created, 'YYYY-MM-DD') as iso_date,
to_char(to_date(to_char(date_created), 'DD/MM/YYYY'), 'YYYY-MM-DD') as conv_date,
to_number(to_char(to_date(date_created,'DD/MM/YYYY'),'IW')) as WEEK_PRODUCED
from your_table;
NLS_DATE ISO_DATE CONV_DATE WEEK_PRODUCED
---------- ---------- ---------- -------------
07/01/2019 2019-01-07 2019-01-07 2
隱式生成的字符串現在有一個4位數的年份,因此將其轉換回來會保留原始世紀。 (你當然還有BCE日期的問題......)
但你根本不應該轉換原始日期。 做就是了:
to_number(to_char(date_created,'IW')) as WEEK_PRODUCED
與在相同的CTE中一樣:
with your_table (date_created) as (
select date '2019-01-07' from dual
)
select
to_number(to_char(date_created,'IW')) as WEEK_PRODUCED
from your_table;
WEEK_PRODUCED
-------------
2
這將適用於您的NLS設置,因為不再進行任何隱式轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.