Mohan
Mohan

Reputation: 248

Trying to convert datetime in date in oracle

Hi i'm trying to convert date 01-03-2020 10:48:27 which obtained from query

 SELECT
  LAST_DAY( ADD_MONTHS(SYSDATE,-3 ) )+1
FROM
  dual;

into '01-Mar-2020' but not able to do trying many concept eg.

trunc(SELECT  LAST_DAY( ADD_MONTHS(SYSDATE , - 3 ) )+1 FROM  dual),'YEAR')

and

SELECT TRUNC(TO_DATE('SELECT  LAST_DAY( ADD_MONTHS(SYSDATE , - 3 ) )+1 FROM  dual','DD-MON-YY'), 'YEAR')  "New Year" FROM DUAL;

but getting error Any idea would be appreciated

Upvotes: 0

Views: 451

Answers (2)

Caius Jard
Caius Jard

Reputation: 74605

You're making things way too complicated. Oracle TRUNC takes an additional parameter to specify whatever time interval to truncate to:

SELECT TRUNC(some_date_here, 'MON') FROM dual

If you put some_date_here as sysdate, then currently it will return 01-May-2020 until next month when it starts returning 01-Jun-2020

You can truncate to any interval; TRUNC 01/01/2000 12:34:56 with 'MI' will return 01/01/2000 12:34:00. Truncating to DD is the default (cut the time off). Truncating to DAY sets the date back to the day that started the week in the country oracle thinks it is in (probably a Sunday or Monday)

More info: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions230.htm#i1002084

As I understood your problem you want to go from the current date, to the first of the month that was between 2 and < 3 months ago (so if it's May now, you want to go back to first of March until it's June, when you want to go back to first of April)

If you hence, in the current date of 5th May, want to go back to a date of 1 March, take 2 months off the current date and then TRUNC to the start of the month:

SELECT TRUNC(ADD_MONTHS(sysdate, -2), 'MON') FROM dual

Don't forget you can TRUNC to the nearest quarter of a year, so if you're doing a report that is "the current quarter", then looking at a variation of TRUNC(sysdate, 'Q') would be the way to go

Lastly, I'd urge you NOT to use oracle to convert your dates to strings (in most cases) - if you keep it as a date all the way 'tIl it hits the user's computer it can be formatted for their regional preferences. If you make a decision as to the format as its coming out the dB it makes it much harder to deliver a good international experience for your app

Upvotes: 3

Littlefoot
Littlefoot

Reputation: 142720

"Convert" in your case means TO_CHAR; alter session is here to set default format for this session.

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select
  2            last_Day(add_months(sysdate, -3)) + 1 orig,
  3    to_char(last_day(add_months(sysdate, -3)) + 1, 'dd-Mon-yyyy', 'nls_Date_language = english') result
  4  from dual;

ORIG                RESULT
------------------- --------------------
01.03.2020 07:25:44 01-Mar-2020

SQL>

Or, if you altered the session, you'd get it as

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> alter session set nls_date_format = 'dd-Mon-yyyy';

Session altered.

SQL> select
  2            last_Day(add_months(sysdate, -3)) + 1 orig
  3  from dual;

ORIG
-----------
01-Mar-2020

SQL>

But, yes - usually we TO_CHAR it.

Upvotes: 1

Related Questions