週の最初の日の日付を取得したいのですが、NLS パラメータに依存させたいです。たとえば、アメリカで実行すると日曜日の日付が表示されるはずですが、トルコでは月曜日が表示されるはずです..
select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;
どうすれば依存させることができますか?
documentationによると、trunc(sysdate, 'IW')
次のものが提供されます。
ISO 8601 標準で定義されている暦週の最初の曜日 (月曜日) と同じ曜日
これまで見てきたように、これは明らかに NLS 依存ではありません。
を使用すると、ISO に依存しない NLS に依存しないバージョンが得られると思うかもしれませんW
が、それは別のことを行います。月の初日と同じ曜日です。7 月 1 日は月曜日だったので、今すぐ実行すると、設定に関係なく月曜日になります。
D
したがって、DY
またはのいずれかが必要ですDAY
- それらはすべて同じように動作します:
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