【问题标题】:sql oracle sysdate: ignore weekendssql oracle sysdate:忽略周末
【发布时间】:2015-03-24 12:33:30
【问题描述】:

我在我的 where 中使用此代码:

and table.datum >= sysdate-7
and table.datum <= sysdate

它显示了过去 7 天的数据 - 我想补充一点,它忽略了周末(周六和周日) - 我检查了互联网,但对我没有任何帮助!

【问题讨论】:

    标签: sql oracle date oracle-sqldeveloper sysdate


    【解决方案1】:

    @Matt 的回答不是防错的。 TO_CHAR(..., 'D' 的结果取决于 NLS_TERRITORY,每个会话可能不同。 由于 TO 似乎是德语(使用 DATUM 作为日期表达式),我什至对 Matt 的解决方案在他的机器上工作感到惊讶。

    查看这个测试用例:

    ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
    
    WITH d AS 
        (SELECT DATE '2015-03-01' + LEVEL AS datum FROM dual CONNECT BY LEVEL <= 31)
    SELECT TO_CHAR(datum, 'yyyy-mm-dd fmDay')
    FROM d
    WHERE TO_CHAR(datum, 'D', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('1', '7')
        AND datum BETWEEN SYSDATE-7 AND SYSDATE;
    
    TO_CHAR(DATUM,'YYYY-MM-DDFMDAY')
    2015-03-18 Wednesday
    2015-03-19 Thursday
    2015-03-20 Friday
    2015-03-23 Monday
    2015-03-24 Tuesday
    
    
    ALTER SESSION SET NLS_TERRITORY = 'GERMANY';
    
    WITH d AS 
        (SELECT DATE '2015-03-01' + LEVEL AS datum FROM dual CONNECT BY LEVEL <= 31)
    SELECT TO_CHAR(datum, 'yyyy-mm-dd fmDay')
    FROM d
    WHERE TO_CHAR(datum, 'D', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('1', '7')
        AND datum BETWEEN SYSDATE-7 AND SYSDATE;
    
    TO_CHAR(DATUM,'YYYY-MM-DDFMDAY')
    2015-03-18 Wednesday
    2015-03-19 Thursday
    2015-03-20 Friday
    2015-03-21 Saturday
    2015-03-24 Tuesday
    

    更安全的是使用DyfmDay格式

    WITH d AS 
        (SELECT DATE '2015-03-01' + LEVEL AS datum FROM dual CONNECT BY LEVEL <= 31)
    SELECT TO_CHAR(datum, 'yyyy-mm-dd fmDay')
    FROM d
    WHERE TO_CHAR(datum, 'Dy', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('Sun', 'Mon')
        AND datum BETWEEN SYSDATE-7 AND SYSDATE;
    

    【讨论】:

      【解决方案2】:

      使用 Between 并添加此 where 语句。

      AND table.datum BETWEEN sysdate-7 and sysdate
      AND TO_CHAR(to_date(substr(table.datum,1,10), 'DD-MM-YYYY'),
                               'D', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('1', '7')
      

      【讨论】:

      • VARCHAR 转换为DATE 然后再转换回VARCHAR 是一个非常糟糕的主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多