【问题标题】:Date range based on Column Date基于列日期的日期范围
【发布时间】:2017-05-02 18:04:56
【问题描述】:

我正在使用最新的 SQL Server。我有一个带有 CreatedDate 列的表。我需要编写一个查询,该查询使用与 CreatedDate 中的日期相差 7 的日期。我不知道该怎么做。我的想法是这样的:

DECLARE @Date datetime 
DECLARE @SevenBefore datetime
DECLARE @SevenAfter datetime
SET @Date = CreatedDate
SET @SevenBefore = DATEADD(day,-7,@Date)
SET @SevenAfter = DATEADD(day,7,@Date)
SELECT *
FROM <table>
WHERE <table> BETWEEN @SevenBefore AND @SevenAfter

问题在于我不能使用“CreatedDate”作为 SET @DATE,因为 SQL 给出了错误“Invalid column name 'CreatedDate'”

任何帮助将不胜感激。我无法列出日期,因为该列中的每个日期都可能不同。

谢谢

【问题讨论】:

  • 你在哪里得到创建日期?如果您使用表中的列值,为什么还要麻烦做 +/- 7?你能给出一些背景吗?它在不同的表中吗?
  • 这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 你的查询甚至没有意义。是SELECT * FROM &lt;table&gt; WHERE &lt;table&gt;.CreatedDate BETWEEN @SevenBefore AND @SevenAfter...?您想将&lt;table&gt; 中的哪个字段限制在此日期范围内?

标签: sql-server date dateadd


【解决方案1】:

在这种情况下,您需要停止像程序员那样思考,而开始像数据库程序员那样思考。

让我们只处理查询的这个中心部分:

SELECT *
FROM <table>
WHERE <table> BETWEEN @SevenBefore AND @SevenAfter

现在,您说 CreatedDate 是表中的一列。对于此示例,我将假设 CreatedDate 位于与上述示例不同的表中。为此,我将为这些表提供两个假名。带有 CreatedDate 的表,我将调用 tblCreated,而上面查询中的表我将调用 tblData。

从上面看,很明显,您无法将整个表格行与日期进行比较。该表中必须有一个包含日期/时间值的字段。我将这个专栏称为TargetDate

鉴于这些假设,您的查询将类似于:

SELECT *
FROM tblCreated tc
INNER JOIN tblData td
    ON td.TargetDate BETWEEN DATEADD(day, -7, tc.CreatedDate) and DATEADD(day, 7, tc.CreatedDate)

看这个,很明显你还需要一些其他的表之间的关联。您是否只想要基于创建日期的每个客户的所有数据行,或者可能只想要在数据记录中显示的对其进行了一些工作的创作,或者??。但是,如果没有更完整的规范,我们将无能为力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多