1

我目前正在研究一个有趣的问题,尽管我会分享它以征求意见。

我有一张桌子,我们称之为Table One。每个ID都有一个由日期时间暗示的有效日期范围(这些实际上是 DATETIME 类型,尽管我在下面奇怪地介绍了它们)Date ADate B。例如,ID 1 从 11 月 1 日到 11 月 3 日有效。

在此处输入图像描述

从这个表中,我想生成一个类似于目标表的表(如下图所示),其中每个 ID/有效日期组合逐行列出:

在此处输入图像描述

为了做到这一点,我还有一个包含连续日期的表,日期的字符串格式,以及开始日期时间和结束日期时间:

在此处输入图像描述

我的经验主要是使用 C#,虽然我可以编写一个脚本来实现这一点,但我担心我会绕过纯 SQL 可以完成的事情。

4

3 回答 3

1

您需要什么作为日历表 - 就像您拥有但使用实际的一样DATETIME,然后只需将您的数据作为

SELECT c.ShortDate, t.Id, t.StartDate, t.EndDate
FROM dbo.Calendar c
JOIN tbl t ON c.ShortDate BETWEEN t.StartDate AND t.EndDate
ORDER BY c.ShortDate, t.Id

旁注:将所有日期保留为DATETIME(或相关数据类型)并让客户端对其进行格式化。

于 2013-11-14T14:37:54.477 回答
1

您可以通过连接来完成,但考虑到您的数据类型,这有点令人费解。最好的做法是在表一中使用具有 DATE 数据类型的列,而不是字符串。然后你可以做这样的事情:

SELECT t2.DateStr, t1.Id
FROM TableOne t1
JOIN TableTwo t2 ON t2 StartDatetime BETWEEN t1.DateA AND t1.DateB
ORDER BY t2.DateStr, t1.Id;
于 2013-11-14T14:39:27.167 回答
1

这是一个与其他解决方案类似的解决方案。不过,我确实有一个SQL Fiddle我花了太长时间创建它,但它的价值。

SELECT ds.datestr, t1.id 
FROM DateStrings ds
INNER JOIN TableOne t1 
    ON ds.startdate BETWEEN t1.startdate AND t1.EndDate
ORDER BY datestr
于 2013-11-14T14:48:21.597 回答