sql-server - 连接在一起的日期之间的差异
问题描述
图片描绘了一千个字。所以突出显示的行(很容易解决)是正确的。
但是我想在其他行上做的是连接月份,例如,如果我们引用在开始日期和结束日期之间有 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 或游标。公司编码标准。
解决方案
画一千字
不!不要发布数据或代码的图片!
即使有图片,您的问题也完全不清楚。而且 - 看看我试图回答 - 你看,我必须输入一个测试场景。这实际上是你的工作......对于下一个问题,请提供一个独立的工作场景并添加预期的输出。添加您自己尝试的代码和一些解释。这值一千字,图片很烦人……
如前所述:这个问题不是很清楚,所以这对你来说可能是错的,但我的魔法水晶球告诉我,你正在寻找这个:
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 中相同,我不知道您想要发生什么...
如果这不能解决您的问题,请使用我的方案,添加解释性数据并使用您问题的编辑选项来提出一个很好的问题......
推荐阅读
- excel - 如何从网站中提取数据到excel
- ios - CAShapeLayer 为什么存在?
- unix - stat 转换为 `find` 命令的 printf
- python - 将二维数组添加到 DataFrame
- c# - 如何在 C# 中检查非法文件/文件夹名称
- javascript - 为什么 chrome 扩展不能在后台标签页中执行?
- apache-spark - Spark Kafka 源和 Confluent 监控拦截器
- svn - TortoiseSVN 由于云同步而丢失修订
- flutter - Flutter 我放了一个 DB 或动态复选框,但我得到一个只读错误
- java - 如何修复 NullPointerException “org.apache.commons.lang3.SystemUtils.JAVA_SPECIFICATION_VERSION_AS_ENUM”为空?