![](/img/trans.png)
[英]Best practices to get first date and last date of previous month in oracle
[英]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.