Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何获得一周的第一天,取决于NLS_Oracle_Nls - Fatal编程技术网

Oracle 如何获得一周的第一天,取决于NLS

Oracle 如何获得一周的第一天,取决于NLS,oracle,nls,Oracle,Nls,我想获得一周中第一天的日期,但我希望它取决于NLS参数。比如说,当我在美国运行它时,它应该给我星期天的日期,但在土耳其它应该给我星期一 select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual; 如何使其独立?,trunc(sysdate,'IW')为您提供: 一周中的同一天为ISO 8601标准定义的日历周的第一天,即星期一 正如您所看到的,这显然不依赖NLS 您可能会认为使用W会提供非ISO、NLS依赖的版本,但它会做一些不同的事情—一

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

select trunc(to_date(sysdate,'dd-mm-yy'),'iw')from dual;
如何使其独立?

trunc(sysdate,'IW')
为您提供:

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

正如您所看到的,这显然不依赖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

顺便提一下,您的原始查询正在执行
到_date(sysdate,'dd-mm-yy')
<代码>系统日期已经是日期。您正在强制将该日期转换为字符串,该字符串将使用
NLS_date_格式
,然后使用
dd-mm-yy
显式转换回日期。这不仅毫无意义,而且如果您的
NLS_DATE_格式
与您明确使用的
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\u日期\u格式继承自
NLS\u TERRITORY
,因此,如果您希望处理多个地区,这可能是一个问题。

当您使用iso week时,所有地区的格式都是相同的。它总是在星期一回来

不要用这个,

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

指向文档的链接已失效。@RisingDarkess-Oracle文档链接经常出现这种情况,这很有帮助。。。修好了,谢谢。