Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-从最新快照数据创建历史事实表_Sql_Sql Server_Sql Server 2008_Datetime_Business Intelligence - Fatal编程技术网

SQL-从最新快照数据创建历史事实表

SQL-从最新快照数据创建历史事实表,sql,sql-server,sql-server-2008,datetime,business-intelligence,Sql,Sql Server,Sql Server 2008,Datetime,Business Intelligence,我目前正在研究一个有趣的问题,尽管我愿意分享它来征求意见 我有一张桌子,就叫它一号桌吧。每个ID都有一个有效日期范围,由日期时间暗示(这些实际上是日期时间类型,尽管我在下面奇怪地介绍了它们)日期A和日期B。例如,ID 1从11月1日起生效,直到11月3日 从这个表中,我想生成一个类似于目标表(如下图所示)的表,其中每个ID/生效日期组合逐行列出: 为了实现这一点,我还有一个包含连续日期的表,该表的日期格式为字符串,还有开始日期时间和结束日期时间: 我的经验主要是使用C#,虽然我可以快速编写

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

我有一张桌子,就叫它一号桌吧。每个ID都有一个有效日期范围,由日期时间暗示(这些实际上是日期时间类型,尽管我在下面奇怪地介绍了它们)日期A和日期B。例如,ID 1从11月1日起生效,直到11月3日

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

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


我的经验主要是使用C#,虽然我可以快速编写一个脚本来完成这项任务,但我担心我会绕过纯SQL可以完成的任务。

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

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中使用日期数据类型的列,而不是字符串。然后你可以这样做:

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;

这里有一个与其他类似的解决方案。不过,我确实有一个想法,我花了太长时间去创造,为了它的价值

SELECT ds.datestr, t1.id 
FROM DateStrings ds
INNER JOIN TableOne t1 
    ON ds.startdate BETWEEN t1.startdate AND t1.EndDate
ORDER BY datestr

谢谢它们实际上是“表一”中的日期时间,我的道歉与“表二”中的道歉不同——但它们是相同的数据类型。法语:les Grand esprits se rencentant:)@t-I也谢谢!它们实际上是“表一”中的日期时间,抱歉,我给出的它们与“表二”中的不同——但它们是相同的数据类型。