简体   繁体   中英

Get first and last day of month into variables - Oracle

I would like to declare some variables that contain the first and last date of the current month in Oracle. I know how to get these values, but evidently not store or use them; I am more of a T-SQL guy.

In T-SQL, I could write:

DECLARE @startDate DATE = GETDATE();
DECLARE @endDate DATE = EOMONTH(GETDATE());

SELECT *
FROM SomeTable
WHERE SomeDate BETWEEN @startDate AND @endDate;

I cannot, for the life of me, work out how to do this in Oracle. I have tried several variations, like:

DECLARE END_DT DATE := TRUNC(LAST_DAY(SYSDATE))
END_DT DATE := TRUNC(LAST_DAY(SYSDATE))

DECLARE END_DT DATE;
SELECT TRUNC(LAST_DAY(SYSDATE)) INTO END_DT FROM DUAL;

I am mostly using 11g, but I would like to be able to use the same script on a 9i/10g server also.

You can use such a query to detect first and last days of the current month :

SELECT TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)))+1,
       TRUNC(LAST_DAY(SYSDATE)) 
  INTO :startDate,:endDate 
  FROM DUAL;

with the contribution of ADD_MONTHS() function

Update : Alternatively use this PL/SQL code block :

DECLARE
  startDate date;
  endDate   date;
BEGIN
 startDate := TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1)))+1;
 endDate   := TRUNC(LAST_DAY(SYSDATE)); 
 DBMS_OUTPUT.PUT_LINE ('startDate :  '||startDate); 
 DBMS_OUTPUT.PUT_LINE ('endDate :  '||endDate);  
END;
/

Demo

You can use the LAST_DAY and TRUNC combination as following:

 DECLARE START_DT DATE := TRUNC(SYSDATE, 'MM'); END_DT DATE := TRUNC(LAST_DAY(SYSDATE)); BEGIN --DBMS_OUTPUT.PUT_LINE(START_DT || ' ' || END_DT); SELECT * INTO <...> FROM SOMETABLE WHERE SOMEDATE BETWEEN START_DT AND END_DT; END; /

Cheers!!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM