, , ,

Номер дня недели

понедельник, 6 июля 2009 г. Оставить комментарий

Достаточно часто необходимо получить номер дня в недели. Для этого обычно пользуемся функцией to_char и маской 'D'. Но возращаемое значение зависит от территории, а не от языка и поэтому часто возращается не правильное значение (обычно день недели, как принято в США). Если есть возможность, то можно установить территорию перед вызовом функции.


alter session set nls_territory = 'CIS';

Но тогда, нужно предварильно сохранить территорию, поменять, применить функцию, и востановить. Я пошел другим путем, создал свою функцию, которая считает день недели, от заданного дня.

create or replace function day_of_week(pd in date)
return integer
is
--monday
vd_start date := to_date('01.01.2001','dd.mm.yyyy');
vi_result integer;
begin
vi_result := mod(trunc(pd) - vd_start, 7);
if (vi_result >= 0) then
vi_result := vi_result + 1;
else
vi_result := vi_result + 8;
end if;

return(vi_result);
end day_of_week;

Теперь проверим.


SQL> alter session set nls_territory = 'CIS';

Session altered

SQL>
SQL> with t as
2 (
3 select to_date('08.06.2000','dd.mm.yyyy') as d from dual
4 union all
5 select to_date('01.01.2001','dd.mm.yyyy') as d from dual
6 union all
7 select trunc(sysdate) + 1 as d from dual
8 )
9 select t.d, to_char(t.d, 'dy', 'NLS_DATE_LANGUAGE = RUSSIAN') as d_day, to_char(t.d, 'd') as d_st, day_of_week(t.d) as d_fn
10 from t;

D D_DAY D_ST D_FN
----------- ----- ---- ----------
08.06.2000 чт 4 4
01.01.2001 пн 1 1
07.07.2009 вт 2 2

SQL> alter session set nls_territory = 'AMERICA';

Session altered

SQL>
SQL> with t as
2 (
3 select to_date('08.06.2000','dd.mm.yyyy') as d from dual
4 union all
5 select to_date('01.01.2001','dd.mm.yyyy') as d from dual
6 union all
7 select trunc(sysdate) + 1 as d from dual
8 )
9 select t.d, to_char(t.d, 'dy', 'NLS_DATE_LANGUAGE = RUSSIAN') as d_day, to_char(t.d, 'd') as d_st, day_of_week(t.d) as d_fn
10 from t;

D D_DAY D_ST D_FN
----------- ----- ---- ----------
08.06.2000 чт 5 4
01.01.2001 пн 2 1
07.07.2009 вт 3 2


Результат функции от смены территории, не меняется.

2 коммент. »

Оставьте Ваш комментарий