gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:42:57 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com