使用滚动 window 从 Sybase SQL 数据库中提取数据
Pulling data from Sybase SQL database using rolling window
我希望从数据库中提取三年的数据,但现在我必须使用 between 语句在我的代码的多个部分中指定日期:
BETWEEN '2015-10-01' AND '2018-09-30'
由于数据库只包含上个月的有效数据向后,我想取上个月的月末回溯三年。
我找到了 this 教程,其中作者展示了如何在 SQL 服务器中执行此操作,我尝试对其进行调整,但我的 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))
如果有人有任何建议,我将非常感谢您的指导。
您当前的代码看起来不错,没有任何错误,但您可以改用 EOMONTH()
。
但是,区别在于 return 类型,您的代码将 return 日期时间,而 eomonth()
将 return 仅日期。
DECLARE @date DATE
SET @date = getdate()
SELECT EOMONTH(@date, -1)
不要使用 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)
;
在你的 WHERE 子句中,你可以使用这个条件:
DATEDIFF(month, [YourDateColumn], GETDATE()) BETWEEN 1 AND 36
我希望从数据库中提取三年的数据,但现在我必须使用 between 语句在我的代码的多个部分中指定日期:
BETWEEN '2015-10-01' AND '2018-09-30'
由于数据库只包含上个月的有效数据向后,我想取上个月的月末回溯三年。
我找到了 this 教程,其中作者展示了如何在 SQL 服务器中执行此操作,我尝试对其进行调整,但我的 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))
如果有人有任何建议,我将非常感谢您的指导。
您当前的代码看起来不错,没有任何错误,但您可以改用 EOMONTH()
。
但是,区别在于 return 类型,您的代码将 return 日期时间,而 eomonth()
将 return 仅日期。
DECLARE @date DATE
SET @date = getdate()
SELECT EOMONTH(@date, -1)
不要使用 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)
;
在你的 WHERE 子句中,你可以使用这个条件:
DATEDIFF(month, [YourDateColumn], GETDATE()) BETWEEN 1 AND 36