2013-06-19 61 views
2

我正在尋找最簡單的方法來確定oracle的DATE值的工作日號碼,而不受NLS設置的影響。無論NLS設置如何,平日編號

Monday -> 1 
Tuesday -> 2 
… 
Sunday -> 7 

任何想法?

+0

NLS設置是否改變以下輸出:select to_char(to_date('03/09/1982','dd/mm/yyyy'),'DY')'? –

+0

@Goat_CO:是的,嘗試'改變會話設置nls_language ='俄語';從雙重選擇to_char(to_date('03/09/1982','dd/mm/yyyy'),'DY');' – schurik

+0

我沒有一個oracle實例來玩,只是好奇,它返回不同的這些日子的名字?你可以使用第0天的比較來確定一週中的哪一天,或者是否因NLS設置而異? –

回答

4

ISO星期一開始;他們不使用NLS設置。我認爲這個表達是可靠的。

1 + trunc(your_date) - trunc(your_date, 'IW') 

顯示算法的工作原理。 。 。 current_date是一個星期三。

select current_date as cur_date 
    , trunc(current_date) as trunc_cur 
    , trunc(current_date, 'IW') as trunc_iso 
    , trunc(current_date) - trunc(current_date, 'IW') as date_diff 
    , 1 + trunc(current_date) - trunc(current_date, 'IW') as dow 
from dual 

CUR_DATE     TRUNC_CUR     TRUNC_ISO     DATE_DIFF DOW 
June 19 2013 16:01:51+0000 June 19 2013 00:00:00+0000 June 17 2013 00:00:00+0000 2   3 

一般來說,如果您找不到合理滿足您期望的表達式,則可以始終使用表格。 (也許,這株從底層實現SQL函數)。

所以,你總是可以使用類似

create table weekday_numbers (
    weekday char(3) not null primary key, 
    weekday_num integer not null unique 
    check(weekday_num between 1 and 7) 
); 

insert into weekday_numbers values ('Mon', 1); 
... 
+0

非常感謝,'1 + trunc(your_date) - trunc(your_date,'IW')'完成了它。帶表的選項不適用於我的情況,因爲日期名稱是特定於語言的。 – schurik

+4

@schurik - 您可以使用[to_char]中的可選[third * nlsparam *參數](http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions200.htm)來強制日期名稱將您的日期轉換爲固定語言,與會話設置無關;然後你可以加入表格。如果你喜歡桌子路線,那就是。 –

+1

我只是寫信說這個解決方案太棒了,太糟糕了,它有點冗長,buuuuuut ....我會很高興地接受它。去全球環境和**沒有** NLS相關的代碼!!!! – pablete

0

一種選擇是使用的不同的剩餘天數在日期間問題和已知星期一的日期(例如1900-01-01)。

mod(my_date-date '1900-01-01',7)+1 day_of_week 

您必須選擇一個適當的古代星期一,以便您使用的所有日期都大於或等於它。