3

我想获取一周第一天的日期,但我希望它依赖于 NLS 参数。说,当我在美国运行它时,它应该给我星期天的日期,但在土耳其它应该给我星期一..

select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;

我怎样才能让它依赖?

4

2 回答 2

5

根据文档trunc(sysdate, 'IW')为您提供:

一周中的同一天与 ISO 8601 标准定义的日历周的第一天,即星期一

如您所见,这显然不依赖于 NLS。

您可能认为 usingW会给您提供非 ISO、NLS 相关的版本,但它会做一些不同的事情 - 一周中的同一天和每月的第一天。所以现在运行,不管你的设置如何,它都会给你星期一,因为 7 月 1 日是星期一。

因此,您需要D,DYDAY- 它们的行为都相同:

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,因此如果您希望处理多个区域,这可能是一个问题。

于 2013-07-18T13:25:59.540 回答
0

当你使用 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
于 2015-09-30T11:24:02.457 回答