我目前正在研究一个有趣的问题,虽然我会分享它以征求意见。
我有一张桌子,我们称之为 Table One 。每个 ID 都有一个生效日期范围 日期时间(这些实际上是DATETIME类型,即使我在下面奇怪地展示了它们)日期A 和日期B 。例如,ID 1从11月1日到11月3日生效。
从这张表中,我想制作一个类似目标表的表格(如下图所示),其中每个ID /生效日期组合逐行列出:
为了实现这一目标,我还有一个包含连续日期的表格,其中包含日期的字符串格式,以及开始日期时间和结束日期时间:
我的经验主要是使用C#,虽然我可以编写一个脚本来实现这一目标,但我担心我会破解纯SQL可以实现的目标。
答案 0 :(得分: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
(或相关数据类型),并让客户对其进行格式化。
答案 1 :(得分:1)
你可以通过连接来实现,但考虑到你的数据类型,它有点复杂。最好的方法是在表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;
答案 2 :(得分: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