簡體   English   中英

在oracle sql中獲取月份的上一個最后日期

[英]get the previous last date of the month in oracle sql

我在下面的查詢中,該查詢在當月的當前月份運行時采用該月的最后日期。 但是由於我將在存儲過程中使用此查詢,並且此過程將在本月的1號,2號或3號運行,因此在這種情況下,我希望每次取上一個上月的日期。 例如,如果查詢在2月2日或2月3日運行,則它將返回1月31日的日期,該日期是上個月的上一個日期。

C_DATE列是日期數據類型

Select * from C_LOG
WHERE C_DATE = LAST_DAY(to_date(sysdate,'YYYYMMDD'))-1

您可以使用EXTRACT( DAY FROM SYSDATE )獲取月份的當前日期。 如果這低於您的閾值,則可以獲取上個月的最后一天,否則可以使用本月的最后一天:

SELECT *
FROM   C_LOG
WHERE  C_DATE = CASE
                WHEN EXTRACT( DAY FROM SYSDATE ) <= 3
                THEN TRUNC( SYSDATE, 'MM' ) - INTERVAL '1' DAY
                ELSE LAST_DAY( TRUNC( SYSDATE ) )
                END

注意事項

不要使用to_date(sysdate,'YYYYMMDD')因為TO_DATE( date_string, format_model )將字符串作為第一個參數,因此Oracle會將日期隱式轉換為字符串。 有效地做:

TO_DATE(
  TO_CHAR(
    SYSDATE,
    ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
  ),
  'YYYYMMDD'
)

如果NLS_DATE_FORMAT不是YYYYMMDD則查詢將失敗。 由於這是一個會話參數,因此每個用戶都可以隨時更改它,並且任何更改該參數而不更改查詢的sql的用戶的查詢都會失敗。

相反,如果要刪除DATE數據類型的時間分量,請使用TRUNC函數。

您可以使用ADD_MONTHS函數,

SELECT ADD_MONTHS(LAST_DAY(SYSDATE), -1) FROM DUAL;

您也可以使用TRUNC功能

SELECT TRUNC(SYSDATE, 'MM')-1 FROM DUAL;

另一個變化:

SELECT *
  FROM c_log
 WHERE c_date =
          TRUNC (
             LAST_DAY (
                CASE
                   WHEN EXTRACT (DAY FROM SYSDATE) <= 3
                   THEN
                      ADD_MONTHS (SYSDATE, -1)
                   ELSE
                      SYSDATE
                END));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM