【问题标题】:Identify the day and get the previous date in Oracle SQL在 Oracle SQL 中识别日期并获取上一个日期
【发布时间】:2022-02-21 19:24:52
【问题描述】:

我有以下查询,它给出了当前日期。我想将值作为字符串返回,因为我使用了TO_CHAR

select NVL(TO_CHAR(sysdate,'DD.MM.YYYY'),0) from dual

但我需要识别 Day 并基于此它应该返回上一个 Date。 例如,当查询在每周一运行时,它应该返回上周五的日期。当查询从周二到周五运行时,它应该返回前一天的日期。

例如,当查询今天运行时,它应该返回上周五的日期,即18.02.2022。当查询在明天运行时,它应该返回今天的日期21.02.2022

我想避免每个星期六和星期日的约会。我们可以在一个查询中做到这一点吗?

【问题讨论】:

  • 附带说明:NVL(datestring, 0) 没有多大意义。至少零应该是一个字符串('0'),但我宁愿期待像 '00.00.0000' 或 '01.01.1900' 或 'no date' 而不是一个零。

标签: sql oracle date


【解决方案1】:

如果您希望查询可以在任何语言和/或地区工作,那么您可以将日期与 ISO 周的开始时间进行比较:

SELECT TO_CHAR(SYSDATE, 'DD.MM.YYYY') AS today,
       CASE TRUNC(SYSDATE) - TRUNC(SYSDATE, 'IW')
       WHEN 0 THEN TO_CHAR(SYSDATE - 3, 'DD.MM.YYYY') -- Monday
       WHEN 6 THEN TO_CHAR(SYSDATE - 2, 'DD.MM.YYYY') -- Sunday
              ELSE TO_CHAR(SYSDATE - 1, 'DD.MM.YYYY') -- Any other day
       END AS previous_weekday
FROM   DUAL;

db小提琴here

【讨论】:

    【解决方案2】:

    作为 MTO 答案的一个细微变化,只是为了让未来的维护者更清楚,您可以改用日期名称或缩写 - 但需要指定日期语言(这可能假设假设的未来维护者使用,或者至少理解那种语言):

    select to_char(sysdate
        - case to_char(sysdate, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH')
            when 'MON' then 3
            when 'SUN' then 2
            else 1
          end, 'DD.MM.YYYY') as result
    from dual
    
    RESULT
    ----------
    18.02.2022
    

    db<>fiddle,包括您在 14 天内看到的内容,而不仅仅是今天。

    【讨论】:

    • 感谢这个解决方案也很完美:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2023-02-21
    相关资源
    最近更新 更多