我想獲得一週中第一天的日期,但我希望它依賴於NLS參數。說,當我在美國運行它應該給我星期日日期,但在土耳其它應該給我星期一..如何獲得一週的第一天,取決於NLS
select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;
我怎樣才能使它依賴?
我想獲得一週中第一天的日期,但我希望它依賴於NLS參數。說,當我在美國運行它應該給我星期日日期,但在土耳其它應該給我星期一..如何獲得一週的第一天,取決於NLS
select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;
我怎樣才能使它依賴?
According to the documentation,trunc(sysdate, 'IW')
爲您提供了與ISO周的第一天(星期一)相同的一週。正如你所見,這顯然不是NLS依賴的。
你可能會認爲使用W
會給你非ISO,NLS依賴的版本,但它做了一些不同的事情 - 與本月的第一天同一天。所以現在跑,這將給你星期一,無論你的設置,自7月1日是一個星期一。
所以,你需要或者D
,DY
或DAY
- 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
默認,所以這可能是一個問題,如果你希望處理多個地區無論如何。
當你使用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