我想获取一周第一天的日期,但我希望它依赖于 NLS 参数。说,当我在美国运行它时,它应该给我星期天的日期,但在土耳其它应该给我星期一..
select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;
我怎样才能让它依赖?
根据文档,trunc(sysdate, 'IW')
为您提供:
一周中的同一天与 ISO 8601 标准定义的日历周的第一天,即星期一
如您所见,这显然不依赖于 NLS。
您可能认为 usingW
会给您提供非 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
,因此如果您希望处理多个区域,这可能是一个问题。
当你使用 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