2013-07-18 61 views
2

我想獲得一週中第一天的日期,但我希望它依賴於NLS參數。說,當我在美國運行它應該給我星期日日期,但在土耳其它應該給我星期一..如何獲得一週的第一天,取決於NLS

select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual; 

我怎樣才能使它依賴?

回答

4

According to the documentation,trunc(sysdate, 'IW')爲您提供了與ISO周的第一天(星期一)相同的一週。正如你所見,這顯然不是NLS依賴的。

你可能會認爲使用W會給你非ISO,NLS依賴的版本,但它做了一些不同的事情 - 與本月的第一天同一天。所以現在跑,這將給你星期一,無論你的設置,自7月1日是一個星期一。

所以,你需要或者DDYDAY - thaey所有的行爲相同:

alter session set nls_territory = 'AMERICA'; 

select trunc(sysdate, 'D') from dual; 

TRUNC(SYS 
--------- 
14-JUL-13 

alter session set nls_territory = 'TURKEY'; 

select trunc(sysdate, 'D') from dual; 

TRUNC(SYSD 
---------- 
15/07/2013 

順便說一句,你原來的查詢正在進行to_date(sysdate,'dd-mm-yy')sysdate已經是日期。您將強制從該日期到字符串的轉換,該字符串將使用您的NLS_DATE_FORMAT,然後使用dd-mm-yy顯式轉換回日期。不僅是沒有意義的,它會如果你的NLS_DATE_FORMAT不匹配(大致,有相當多的迴旋餘地)的dd-mm-yy使用明確突破:

alter session set nls_date_format = 'dd/mm/yyyy'; 

select to_date(sysdate,'dd-mm-yy') from dual; 

TO_DATE(SY 
---------- 
18/07/2013 

alter session set nls_date_format = 'dd-mon-rr'; 

select to_date(sysdate,'dd-mm-yy') from dual; 

TO_DATE(S 
--------- 
18-jul-13 

alter session set nls_date_format = 'mm/dd/yyyy'; 

select to_date(sysdate,'dd-mm-yy') from dual; 
select to_date(sysdate,'dd-mm-yy') from dual 
       * 
ERROR at line 1: 
ORA-01843: not a valid month 

alter session set nls_date_format = 'yyyy-mm-dd'; 

select to_date(sysdate,'dd-mm-yy') from dual; 
select to_date(sysdate,'dd-mm-yy') from dual 
       * 
ERROR at line 1: 
ORA-01861: literal does not match format string 

...等,並您NLS_DATE_FORMAT繼承從NLS_TERRITORY默認,所以這可能是一個問題,如果你希望處理多個地區無論如何。

0

當你使用iso周時,所有地區都是一樣的。它總是返回星期一。

而不是使用這個;

select sysdate your_date, 
     trunc(sysdate,'IW') iso_start_of_week, 
     to_char(sysdate,'D') your_territory_day, 
     trunc(sysdate)- to_char(sysdate,'D') + 1 this_is_what_u_want 
from dual 
相關問題