我想获取一周中第一天的日期,但我希望它依赖于 NLS 参数。比如说,当我在美国运行它时,它应该给我星期天的约会,但在土耳其它应该给我星期一..
select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;
我怎样才能让它依赖?
最佳答案
According to the documentation , trunc(sysdate, 'IW')
给你:
Same day of the week as the first day of the calendar week as defined by the ISO 8601 standard, which is Monday
如您所见,这显然与 NLS 无关。
您可能认为使用 W
会为您提供非 ISO、NLS 相关的版本,但它会做一些不同的事情 - 一周中的同一天与一个月的第一天。所以现在运行,无论您的设置如何,都会给您星期一,因为 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
继承的,因此如果您希望处理多个区域,这可能是一个问题无论如何。
关于oracle - 如何获取一周的第一天,取决于NLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17723300/