我希望从数据库中提取三年的数据,但是现在我必须使用between语句在代码的多个部分中指定日期:
BETWEEN '2015-10-01' AND '2018-09-30'
由于数据库仅包含上个月倒退的有效数据,所以我希望使用上个月的末尾并倒退三年。
我发现了this教程,作者在其中演示了如何在SQL Server中执行此操作,并且我试图对其进行改编,但我的RDBMS在datediff函数中引发了错误
----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
我的代码如下所示,但是我看到的错误是关于将0转换为日期。
DECLARE @date DATE
SET @date = getdate()
SELECT dateadd(second,-1,dateadd(mm, DATEDIFF(m,0,GETDATE()),0))
如果有人有任何建议,我将非常感谢您的指导。
答案 0 :(得分:1)
在WHERE子句中,您可以使用以下条件:
DATEDIFF(month, [YourDateColumn], GETDATE()) BETWEEN 1 AND 36
答案 1 :(得分:0)
您当前的代码看起来不错,没有任何错误,但是您可以改用EOMONTH()
。
但是,区别在于返回类型是您的代码将返回日期时间,而eomonth()
仅返回日期。
DECLARE @date DATE
SET @date = getdate()
SELECT EOMONTH(@date, -1)
答案 2 :(得分:0)
不要使用between
,工作将变得更加容易。 当月第一天的使用时间少于,这可以准确地找到该日期之前的所有内容(而不是上个月的最后一天)。从同一日期减去3年,并以> =作为起点。
Select *
From yourtables
where datecol >= dateadd (year,-3,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) )
And datecol < DATEADD(mm,DATEDIFF(m,0,GETDATE()),0)
请不要使用任何将23:59:59当作一天结束的解决方案。一天还没有结束,现在有几种数据类型支持亚秒级的时间精度。
如果您真的不能在日期函数中使用零,则只需使用基本日期“ 1900-01-01”代替
SELECT
DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01'))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), '1900-01-01')
;
这也应该起作用(确实in this demo here):
SELECT
DATEADD(YEAR, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0))
, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)
;