• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 649
  • Last Modified:

YTD report dates in oracle

select TRUNC(TO_DATE(sysdate),'YEAR'),
       (last_day(trunc(add_months(sysdate,-1)))) + 1 - (1/86400)
  from dual

TRUNC(TO_DATE(SYSDATE)-1,'YEAR')|(LAST_DAY(TRUNC(ADD_MONTHS(SYSDATE,-1))))+1-(1/86400)
1/1/2013|12/31/2012 11:59:59 PM

_____________________

I need to run a year to date report.
In January 2013 I need the date parameters from 1/1/2012 to 12/31/2012
In feb 2013 I need the date parameters from 1/1/2013 to 1/31/2013

In december 2013 from 1/1/2013 to 11/30/2012
In Jan 2014 from 1/1/2013 to 12/31/2013.

Any help appreciated
0
anumoses
Asked:
anumoses
  • 4
  • 3
  • 3
  • +1
2 Solutions
 
sdstuberCommented:
for results to the last day...

SELECT TRUNC(ADD_MONTHS(SYSDATE, -1), 'yyyy'), TRUNC(SYSDATE, 'mm') - 1 FROM DUAL


for results to the last second...

SELECT TRUNC(ADD_MONTHS(SYSDATE, -1), 'yyyy'), TRUNC(SYSDATE, 'mm') - 1/86400 FROM DUAL
0
 
sdstuberCommented:
simple verification code...


SELECT d, TRUNC(ADD_MONTHS(d, -1), 'yyyy'), TRUNC(d, 'mm') - 1 / 86400
  FROM (SELECT     ADD_MONTHS(TO_DATE('20120615', 'yyyymmdd'), LEVEL) d
              FROM DUAL
        CONNECT BY LEVEL <= 24)
0
 
anumosesAuthor Commented:
On feb 2nd if I want to run from 01-jan-2013 to 31-jan-2013, will the same query work?

Thanks,
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
Steve WalesSenior Database AdministratorCommented:
Post here that talks about finding dates based upon current / previous / next value of year, month etc.
http://programmerslounge.blogspot.com/2011/07/how-to-get-first-day-and-last-day-of.html

You seem to always need the first day of the year represented by the previous month
If you're in January, you want the 1st day of the query to be January 1 of the previous year:

select TRUNC(ADD_MONTHS(SYSDATE, -1) , 'Year') from dual;

That would give you midnight of the first day of the year.

To get the last day of the previous month at 23:59:59 you could take the first day of the current month -1 second:

select TRUNC(SYSDATE , 'Month')-1/86400 from dual;

Running those two queries today (Jan 8, 2013) I get

2012-01-01 00:00:00
2012-12-31 23:59:59
0
 
anumosesAuthor Commented:
Oh that helped a lot. Thanks,
0
 
sdstuberCommented:
>>> on feb 2nd if I want to run from 01-jan-2013 to 31-jan-2013, will the same query work?


yes, adjust the verification query to test whatever dates you want


it will correctly handle leap years too
0
 
anumosesAuthor Commented:
thanks
0
 
awking00Commented:
select * from yourtable where datefield between
decode(to_char(sysdate,'mm'),'01',trunc(add_months(sysdate,-1),'yyyy'),trunc(sysdate,'yyyy')) and trunc(sysdate,'mm') -1/86400
from dttbl;
0
 
awking00Commented:
Didn't mean to copy "from dttbl;" (my test table)

select * from yourtable where datefield between
decode(to_char(sysdate,'mm'),'01',trunc(add_months(sysdate,-1),'yyyy'),trunc(sysdate,'yyyy')) and trunc(sysdate,'mm') -1/86400;
0
 
sdstuberCommented:
why the decode?  

trunc(add_months(sysdate,-1),'yyyy')


from my original post is sufficient for all months
try the verification code in my second post to confirm
0
 
awking00Commented:
I was a little late noticing it wasn't necessary and didn't bother changing since your solution had already been accepted by the time I posted :-)
0

Featured Post

Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

  • 4
  • 3
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now