簡體   English   中英

如何從使用Oracle Sql的日期獲得正確的ISO周編號

[英]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.

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