Reputation: 2867
I wish to pull three years of data from a database but right now I have to specify the dates in a number of sections in my code using a between statement:
BETWEEN '2015-10-01' AND '2018-09-30'
Since the database only contains valid data from the previous month backwards, I wish to take the end of the last month and go back three years.
I found this tutorial where the author shows how to do this in SQL server and I've tried to adapt it but my RDBMS is throwing errors in the datediff function
----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
My code looks as follows but I the error I am seeing is about converting 0 to a date.
DECLARE @date DATE
SET @date = getdate()
SELECT dateadd(second,-1,dateadd(mm, DATEDIFF(m,0,GETDATE()),0))
If anyone has any suggestions I would be very grateful for your guidance.
Upvotes: 0
Views: 515
Reputation: 35593
Don't use between
and the job becomes far easier. Use less than the first day of the current month which accurately locates everything before that date (instead of last day of previous month). Subtract 3 years from that same date and use >= for the starting point.
Select *
From yourtables
where datecol >= dateadd (year,-3,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) )
And datecol < DATEADD(mm,DATEDIFF(m,0,GETDATE()),0)
Please don't use any solution that use 23:59:59 as the end of a day. It is not the end of a day and several data types now support sub-second time precision.
If you really cannot use zero in the date functions simply use the base date of '1900-01-01' instead
SELECT
DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01'))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01')
;
This should also work (it does in this demo here):
SELECT
DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)
;
Upvotes: 0
Reputation: 4100
In your WHERE clause, you could use this condition:
DATEDIFF(month, [YourDateColumn], GETDATE()) BETWEEN 1 AND 36
Upvotes: 1
Reputation: 50163
Your current code looks good without any error, but you can use EOMONTH()
instead.
However, the difference would be in return types your code would return date-time while eomonth()
would return date only.
DECLARE @date DATE
SET @date = getdate()
SELECT EOMONTH(@date, -1)
Upvotes: 0