动态计算日期列MS SQL Server中所有行的DateDiff

时间:2018-10-18 17:43:52

标签: sql-server tsql

我试图计算称为public function cursos_relacionados(){ return $this->belongsToMany('App\Model\Curso','cursos_has_cursos_relacionados','curso_id','curso_relacionado_id'); } 的单列中连续行的日期之间的天差。然后,我想将这些差异放入名为Expected_Results的新列中。

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

Date_col

以下是我要返回的内容:

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

但是,查询成功运行,但未返回任何内容。我怀疑这是因为我缺少某种迭代行的循环。如何在查询中加入while循环以成功遍历行,以便查询显示预期结果?

2 个答案:

答案 0 :(得分: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 中间语句中的无效列名。

答案 1 :(得分:0)

由于SET部分(其中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进行比较,这意味着即使您更改了变量的数据类型为INT,这部分查询将不起作用

WHERE Date_col = @datedifferences

现在,根据您的代码,我认为您希望从表中选择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; 的日期可能是

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;

更新:

  

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

type="button"