【问题标题】:T-SQL go through DatesT-SQL 遍历日期
【发布时间】:2019-04-28 19:42:05
【问题描述】:

我有下表:

Column1     Column2   Column3
04/07/2019    1
04/08/2019    2
04/09/2019    8
04/10/2019    9
04/11/2019    15
04/12/2019    16
04/13/2019    5
04/14/2019    6 
04/15/2019    8
04/16/2019    9 
04/17/2019    10 
04/18/2019    11  
04/19/2019    5 
04/20/2019    5 
04/21/2019    8    
04/22/2019    8 
04/23/2019    9 
04/24/2019    10 
04/25/2019    11  
04/26/2019    12 
04/27/2019    10 

我需要找到一种方法来遍历第一列中的值并确定应该从周六到周日开始的周数。所以,在这个例子中,一次迭代应该是从 14 到 20 日。或者另一个迭代将是从 7 日到 13 日,即周六 - 周日。然后在确定每周之后,我需要对其他列进行一些计算。如果 Column2 在 1 周内(基于 Column1 周六到周日)的总金额超过 40,则计算将更新 Column3。然后一周的下一个迭代(星期六 - 星期日)也是如此。

期望的结果:

Column1    Column2   Column3
04/07/2019    1        56
04/08/2019    2        56
04/09/2019    8        56
04/10/2019    9        56
04/11/2019    15       56
04/12/2019    16       56
04/13/2019    5        56
04/14/2019    6        54
04/15/2019    8        54
04/16/2019    9        54
04/17/2019    10       54
04/18/2019    11       54
04/19/2019    5        54
04/20/2019    5        54
04/21/2019    8        68
04/22/2019    8        68
04/23/2019    9        68
04/24/2019    10       68
04/25/2019    11       68
04/26/2019    12       68
04/27/2019    10       68

请注意:数据范围从 3 周到几个月不等。因此,代码需要捕获任何特定范围的周数。

【问题讨论】:

  • 游标几乎从来都不是合适的解决方案,实际上在这种情况下也不是。 DATEPART(WEEK, Column1)GROUP BY 的某种组合应该可以满足您的需求。
  • 您不需要光标。但提供您想要的结果(并设置某种 db fiddle)来澄清问题。
  • 好的,修改了问题。

标签: sql sql-server database tsql


【解决方案1】:

您可以使用datepart() 获取日期的星期几。然后,您可以在窗口化的sum() 中使用星期进行分区。从那里你可以UPDATE 加入一个派生表,得到前面提到的总和。为了确保星期从星期日开始,在 UPDATE 之前发出 SET DATEFIRST 7

SET DATEFIRST 7;
UPDATE t1
       SET t1.column3 = t3.column3
       FROM elbat t1
            INNER JOIN (SELECT t2.column1,
                               sum(t2.column2) OVER (PARTITION BY datepart(week, t2.column1)) column3
                               FROM elbat t2) t3
                       ON t3.column1 = t1.column1;

db<>fiddle

【讨论】:

  • 非常感谢!如果其中一个范围的开始日期从一周中开始,这将如何工作。例如,它不是从 7 号开始,而是从 10 号开始。所以,它应该在第 10 到第 13 之间。而不是第 7 到第 13。原因是有时开始和结束日期并不完全从星期六开始并在星期日结束。
  • datepart() 获取一天中的星期几,而与表中该星期的其他日子的存在无关。如果一周中只有三天,则总和是基于这三天的数据建立的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2016-04-15
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多