【问题标题】:Oracle get last weekday Mon-Fri甲骨文获取上个工作日周一至周五
【发布时间】:2021-07-20 19:48:48
【问题描述】:

我想获得最后一个工作日。 如果是周二到周六,那就是前一天。如果是周日或周一,那就是周五。

到目前为止,我已经尝试过这个,但我正在努力获得所需的输出。

SELECT
    level AS dow,
    trunc(sysdate, 'D') + level day,
    to_char(trunc(sysdate, 'D') + level, 'Day') AS day_week,
    CASE
        WHEN to_char(trunc(sysdate, 'D') + level, 'Day') IN (
            'Sunday',
            'Monday'
        ) THEN
            trunc(sysdate - 2, 'IW') + 4
        ELSE
            sysdate - 1
    END calculation
FROM
    dual
CONNECT BY
    level <= 7;

【问题讨论】:

  • trunc(sysdate, 'D') 的结果取决于当前用户会话 NLS_TERRITORY 设置。 MT0 建议更好地使用IW

标签: sql oracle


【解决方案1】:

此解决方案不受语言和地域的影响:

SELECT date_value,
       date_value - CASE TRUNC(date_value) - TRUNC(date_value, 'IW')
                    WHEN 0 THEN 3 -- Monday
                    WHEN 6 THEN 2 -- Sunday
                    ELSE 1        -- Tuesday to Saturday
                    END AS previous_weekday
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name (date_value) AS
SELECT TRUNC(sysdate - LEVEL + 1)
FROM   DUAL
CONNECT BY LEVEL <= 7;

输出(日期格式YYYY-MM-DD HH24:MI:SS (DY)):

DATE_VALUE PREVIOUS_WEEKDAY
2021-07-20 00:00:00 (TUE) 2021-07-19 00:00:00 (MON)
2021-07-19 00:00:00 (MON) 2021-07-16 00:00:00 (FRI)
2021-07-18 00:00:00 (SUN) 2021-07-16 00:00:00 (FRI)
2021-07-17 00:00:00 (SAT) 2021-07-16 00:00:00 (FRI)
2021-07-16 00:00:00 (FRI) 2021-07-15 00:00:00 (THU)
2021-07-15 00:00:00 (THU) 2021-07-14 00:00:00 (WED)
2021-07-14 00:00:00 (WED) 2021-07-13 00:00:00 (TUE)

db小提琴here

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 2017-09-16
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多