【问题标题】:Pulling data from Sybase SQL database using rolling window使用滚动窗口从 Sybase SQL 数据库中提取数据
【发布时间】:2018-10-10 08:59:21
【问题描述】:

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

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

【问题讨论】:

  • 请提供完整的错误信息
  • 旁白:最佳实践是使用monthDateAddDateDiff 来指定datepart。最糟糕的做法是在一个表达式中同时使用mmm
  • @Used_By_Already [代码:102,SQL 状态:42W04] SQL Anywhere 错误 -131:第 6 行的“datediff”附近的语法错误

标签: sql sybase


【解决方案1】:

在你的 WHERE 子句中,你可以使用这个条件:

DATEDIFF(month, [YourDateColumn], GETDATE()) BETWEEN 1 AND 36

【讨论】:

    【解决方案2】:

    您当前的代码看起来不错,没有任何错误,但您可以改用EOMONTH()

    但是,不同之处在于您的代码将返回日期时间的返回类型,而 eomonth() 将仅返回日期。

    DECLARE @date DATE
    SET @date = getdate()
    
    SELECT EOMONTH(@date, -1)
    

    【讨论】:

    • 感谢您的回复,但 EOMONTH() 似乎不是在我的数据库中工作的函数。我已经检查了 sybase 文档,但它没有出现在那里。感谢您的帮助。
    • @TheGoat。 . . EOMONTH() 可与SQL Server 一起使用。
    • 也许是这样,但我使用的是 Sybase Transact-SQL??
    【解决方案3】:

    不要使用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)
    ;
    

    【讨论】:

    • 我的系统似乎不喜欢 datediff 为 0
    • 请提供准确的错误信息。还要检查数据库类型和版本。上面的解决方案是TSQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2012-11-16
    • 2015-02-16
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多