【问题标题】:Dynamically Calculate DateDiff for all rows in Date column MS SQL Server动态计算日期列 MS SQL Server 中所有行的 DateDiff
【发布时间】:2018-10-18 17:43:51
【问题描述】:

我正在尝试计算名为Date_col 的单个列中连续行的日期之间的天数差异。然后,我想将这些差异放入一个名为 Expected_Results 的新列中。

到目前为止,我有以下代码:

DECLARE @datedifferences DATETIME

SET @datedifferences = (SELECT DATEDIFF(DAY, MIN(Date_col), MAX(Date_col)) FROM Schema.Table)

SELECT DISTINCT TOP 100 Date_col
FROM Database.Schema.Table
WHERE Date_col = @datedifferences
ORDER BY Date_col

以下是我想要返回的内容:

Date_col    Expected_Results
1/1/2018    --
2/2/2018    31
3/3/2018    31
4/4/2018    31
5/5/2018    31
6/6/2018    31
7/7/2018    31
8/8/2018    31

但是,查询成功运行,但没有返回任何内容。我怀疑这是因为我缺少某种循环来遍历行。如何将 while 循环合并到查询中以成功迭代行以便查询打印预期结果?

【问题讨论】:

  • @datedifferences` 被声明为DATETIME,但被分配给DATEDIFF 函数的返回值,即returns an integer
  • 你能把实际的错误贴出来
  • Lag 是从select 中的前一行访问数据的(现代)方式。假设您有一个未公开的表,其中有一列包含日期,并且希望按顺序显示日期以及连续行中日期之间的天数。您的问题缺少一个问题,以及其他细节。不确定“日总和差异”是关于什么的。请阅读this 了解一些改进问题的技巧。

标签: sql-server tsql


【解决方案1】:

你认为这只是一个声明吗?因为不是。您有 3 个单独的语句:

DECLARE @datedifferences datetime;

SET @datedifferences = DATEDIFF(day, min(Date_col), max(Date_col));

SELECT DISTINCT TOP 100 Date_col
FROM Database.Schema.Table
WHERE Date_col = @datedifferences
ORDER BY Date_col;

中间语句 (SET...) 无法访问它下面的 SELECT 语句的 FROM 子句,因此它不知道您在其中引用的 Date_col。因此Date_col 中间语句中的无效列名。

【讨论】:

  • 。 . .你需要@datedifferences 作为INT 类型而不是datetime
  • @YogeshSharma 也是如此,但这不是问题中错误消息的原因。
  • @TabAlleman OP 终于在我的回答下的评论中说出了他想要做什么。
  • @TabAlleman,我已将 FROM 子句添加到 SET 语句中,虽然现在查询运行,但它没有返回任何值。你能帮忙吗?
【解决方案2】:

那是因为 SET 部分,其中 hte Date_Col 列是未知/可访问的,您需要指定从哪里喜欢

DECLARE @datedifferences datetime;
SET @datedifferences = (SELECT DATEDIFF(day, min(Date_col), max(Date_col)) FROM Database.Schema.Table);
SELECT DISTINCT TOP 100 Date_col
FROM Database.Schema.Table
WHERE Date_col = @datedifferences
ORDER BY Date_col;

现在,DATEDIFF() 函数返回 INT 数据类型,并且您的 @datedifferences 声明为 DATETIME 数据类型。 这是第一个,所以你不能用它来比较 WHERE 子句,因为我认为你不想比较 DATETIMEINT,这意味着即使你将变量的数据类型更改为 @ 987654332@这部分查询无效

WHERE Date_col = @datedifferences

现在,根据您的代码,我认为您想从您的表中选择前 100 个 Date_ColMAX()MIN() 之间的日期,所以您的代码可能看起来像

DECLARE @MaxDate DATETIME = (SELECT MAX(Date_Col) FROM Database.Schema.Table);
DECLARE @MinDate DATEIME = (SELECT MIN(Date_Col) FROM Database.Schema.Table);

SELECT DISTINCT TOP 100 Date_col
FROM Database.Schema.Table
WHERE Date_col BETWEEN @MaxDate AND @MinDate
ORDER BY Date_col;

更新:

我只想计算 date_col 中前 100 行的 date_diffs

SELECT DATEDIFF(Day, MIN(Date_Col), MAX(Date_Col)) As Def
FROM
(
    SELECT TOP 100 Date_Col
    FROM Database.Schema.Table
    ORDER BY Date_Col
) T;

【讨论】:

  • 。 . .你需要@datedifferences 作为INT 类型而不是datetime
  • @YogeshSharma 是的,我的回答还有其他更新,顺便说一句
  • 当我用 datetime 代替 int 我得到这个错误:操作数类型冲突:日期与 int 不兼容
  • 然后如何将@datedifferences 的结果插入新列?
  • 查询运行成功但没有返回任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多