oracle - 如何获取一周的第一天,取决于NLS

标签 oracle nls

我想获取一周中第一天的日期,但我希望它依赖于 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 日是星期一。

因此您需要 DDYDAY - 它们的行为都相同:

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/

相关文章:

asp.net - ASP 成员(member)资格奇怪的问题

r - 如何计算 r 中非线性最小二乘法的置信区间?

r - 是否可以从模型中调用 nls 参数?

r - 如何将 nlsList 中的系数获取到数据框中?

oracle - Delphi - Oracle RowID 被 dbGO/ADO 忽略

php: 加载 oracle 驱动程序给出错误 "Unable to load dynamic library - The specified procedure could not be found."

sql - PL/SQL - 你能通过索引访问游标中的特定记录吗?

sql - 基于子查询显示列

c - 在 Win32 中使用 C 语言中的扩展 ASCII 归类表

r - 比较非线性回归模型