1

我目前正在研究一个有趣的问题,尽管我会分享它来征求意见。SQL - 从最新的快照数据创建历史事实表

我有一个表,可以叫它表一。每个ID有由日期时间暗示的生效日期范围(这实际上是DATETIME类型,即使我提出了他们奇怪下文)日期日期乙。例如,ID 1从11月1日起至11月3日生效。

enter image description here

从该表,我想以产生类似于目标表(下图),其中,每个ID /生效日期组合列出行接一行的表:

enter image description here

要做到这一点,我也有含连续日期,与日期字符串格式的表格,有一个开始日期时间和结束日期时间沿:

enter image description here

我的经验主要是用C#,虽然我可以用脚本来完成这个任务,但我担心我会用纯SQL来完成什么。

回答

1

你可以用连接来完成,但考虑到你的数据类型,这有点复杂。最好的做法是在Table One中使用包含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; 
+0

谢谢!他们实际上是“表一”中的日期时间,道歉我给他们不同于“表二”中的 - 但他们是相同的数据类型。 – mikey

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(或相关数据类型)和让客户格式化它。

+0

在法国:les grands esprits se rencontrent :) –

+0

@ t-i谢谢!他们实际上是“表一”中的日期时间,道歉我给他们不同于“表二”中的 - 但他们是相同的数据类型。 – mikey

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