Oracle SQL Sysdate 无法与 nls_date_format='DD-MON-RR' 正确比较

Posted

技术标签:

【中文标题】Oracle SQL Sysdate 无法与 nls_date_format=\'DD-MON-RR\' 正确比较【英文标题】:Oracle SQL Sysdate not comparing properly with nls_date_format='DD-MON-RR'Oracle SQL Sysdate 无法与 nls_date_format='DD-MON-RR' 正确比较 【发布时间】:2021-02-08 10:00:42 【问题描述】:

我有一个 oracle sql 代码,与手动输入的日期(最后一个星期四或星期五)相比,使用 sysdate 时得到的结果不一致。

例如:

    更改会话集 nls_date_format='DD-MON-RR';

    使用以下在星期一运行自定义日期的 where 子句进行查询:

    正常工作的手动输入:

    WHERE DATECOLUMN= to_date('2021/01/29','yyyy/mm/dd') -- key in previous Friday's date
    
    WHERE DATECOLUMN= case when to_char(sysdate,'D')=2 then sysdate-3 
                           else to_date('9999/01/01','yyyy/mm/dd') 
                      end -- if today is monday, then pick last Friday's date for the run else pick a dummy date.
    

我确信 python 中的 alter session 脚本工作正常,因为我也在 Alteryx 中进行了测试。但是,我仍然无法让结果与手动输入的日期相匹配。我使用 select 测试了 sysdate-3 与 DATECOLUMN 的比较,它似乎在 TOAD 上工作,所以我没有看到导致不匹配的问题。

当两段代码都应该将 DATECOLUMN 与相同的值进行比较时,导致结果不匹配的原因可能是什么?

【问题讨论】:

【参考方案1】:

to_char(sysdate,'D') 的结果取决于当前用户会话 NLS_TERRITORY 设置。

对于更可靠的解决方案,更好地使用例如:

TO_CHAR(sysdate, 'fmDay', 'NLS_DATE_LANGUAGE = American') = 'Monday'

【讨论】:

【参考方案2】:

SYSDATE - 3 同时返回 DATE TIME 组件,例如

SQL> select sysdate - 3 from dual;

SYSDATE-3
-------------------
05.02.2021 11:06:04

SQL>

您的代码表明 DATECOLUMN 仅包含 DATE 组件。因此,尝试使用

trunc(sysdate) - 3

这将“删除”时间组件(实际上,会将值设置为前一个午夜):

SQL> select trunc(sysdate) - 3 from dual;

TRUNC(SYSDATE)-3
-------------------
05.02.2021 00:00:00

因此,您的代码将是

WHERE DATECOLUMN= case when to_char(sysdate,'D')=2 then trunc(sysdate) - 3 
                       else to_date('9999/01/01','yyyy/mm/dd') 
                  end

【讨论】:

以上是关于Oracle SQL Sysdate 无法与 nls_date_format='DD-MON-RR' 正确比较的主要内容,如果未能解决你的问题,请参考以下文章

oracle 与sql server 部分内置函数替换

使用 sysdate 时的 Oracle SQL,为啥它没有给出预期的结果

ORACLE PL/SQL - 使用 SYSDATE 检索特定日期的数据时出现检索问题

sql server to oracle

MySQL与Oracle的语法区别详细对比

在 oracle SQL 中比较 DATE 和 SYSDATE 时,他们考虑时间吗?