首页 > 解决方案 > 连接在一起的日期之间的差异

问题描述

图片描绘了一千个字。所以突出显示的行(很容易解决)是正确的。

但是我想在其他行上做的是连接月份,例如,如果我们引用在开始日期和结束日期之间有 4 个月的第 2 行:“1015 1115 1215 0116”

关于如何实现这一点的任何建议?

SQL Server 版本是 2012。

在此处输入图像描述

为了澄清:

出于这个问题的目的,我们需要专注于两列 - StartDate 和 EndDate。“NumberOfColumns”是我创建的派生列,它显示从开始到结束的总月数。您可以忽略“PaymentHolidaysTaken”

助手屏幕截图的最后一列以及我想要实现的是 - 显示从 StartDate 到 EndDate 的每个月和年的 MMYY(带有空格分隔符)。如上所述,第 2 行是几个月和几年的一个很好的例子,我希望这个值是“1015 1115 1215 0116”。第 4 行需要为“0916 1016”

这是否澄清?

我不能接受 - 动态 SQL 或游标。公司编码标准。

标签: sql-servertsqlsql-server-2012

解决方案


画一千字

不!不要发布数据或代码的图片

即使有图片,您的问题也完全不清楚。而且 - 看看我试图回答 - 你看,我必须输入一个测试场景。这实际上是你的工作......对于下一个问题,请提供一个独立的工作场景并添加预期的输出。添加您自己尝试的代码和一些解释。这值一千字,图片很烦人……

如前所述:这个问题不是很清楚,所以这对你来说可能是错的,但我的魔法水晶球告诉我,你正在寻找这个:

DECLARE @tbl TABLE(D1 DATE, D2 DATE);

INSERT INTO @tbl VALUES
 ({d'2016-02-01'},{d'2016-03-31'})
,({d'2015-10-01'},{d'2016-01-31'})  --Your Row 2
,({d'2016-09-01'},{d'2016-10-31'})  --Your Row 4
,({d'2015-12-01'},{d'2015-12-31'})
,({d'2018-04-01'},{d'2018-06-30'})
,({d'2018-04-04'},{d'2018-06-30'})  --Day index != 1, but smaller in D1
,({d'2018-04-04'},{d'2018-06-03'}); --Day index is smaller in D2

SELECT t.*
      ,A.CountOfMonths
      ,(
         SELECT TOP(A.CountOfMonths) CONCAT(' '
                                           ,FORMAT(DATEADD(MONTH,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1,D1),'MMyy')
                                           ) 
         FROM master..spt_values
         FOR XML PATH('')
       )
FROM @tbl t
CROSS APPLY (SELECT DATEDIFF(MONTH,D1,D2)
                    + CASE WHEN DAY(D1)<DAY(D2) THEN 1 ELSE 0 END) A(CountOfMonths);

结果

D1          D2         CoM   
2016-02-01  2016-03-31  2    0216 0316
2015-10-01  2016-01-31  4    1015 1115 1215 0116
2016-09-01  2016-10-31  2    0916 1016
2015-12-01  2015-12-31  1    1215
2018-04-01  2018-06-30  3    0418 0518 0618
2018-04-04  2018-06-30  3    0418 0518 0618
2018-04-04  2018-06-03  2    0418 0518

该查询将使用一些计算来查找两个日期之间的“NumberOfMonths”。该值将用于获取TOP()表的行。我使用master..spt_values的只是一个有很多行的表。我们对这些值不感兴趣,只对具有正确行数的结果集感兴趣。在这组中,我申请ROW_NUMBER获得一个流水号(1,2 或 1,2,3,4 等)。这个运行数字以月为单位添加到 D1。最终输出由FORMAT().

带有 4 月 4 日的行显示,您的第一次约会并不总是本月的第一天。所以我添加了一个案例,其中第二个月的日索引较小,我使用 aCASE在“正常”情况下再添加一个月。可能是,您想将其更改为<=...如果当天的索引在 D1 和 D2 中相同,我不知道您想要发生什么...

如果这不能解决您的问题,请使用我的方案,添加解释性数据并使用您问题的编辑选项来提出一个很好的问题......


推荐阅读