使用滚动窗口从Sybase SQL数据库中提取数据

时间:2018-10-09 11:05:59

标签: sql sybase

我希望从数据库中提取三年的数据,但是现在我必须使用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))

如果有人有任何建议,我将非常感谢您的指导。

3 个答案:

答案 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)
;