我有一条记录和该记录的关联日志日期。 我想根据它属于第3个表的日期范围将其插入到另一个表中。
例如:
要插入表1中的记录
Col1 | Col 2 | Col 3 | Log_Date | Table2.ID
表2:
ID | ColA | ColB | Start_Date | End_Date |
如果Log_Date在Start_Date和End_Date之间,则将记录与表2中的ID一起插入。根据Col2 = ColA和Col3 = ColB的匹配项,我提取表2。
例如(我的解释很差,所以我希望这可以使它更清楚):
表2:
ID | ColA | ColB | Start_Date | End_Date
1 | 123 | 345 | 2018-08-28 | 2018-09-29
2 | 123 | 345 | 2018-09-29 | NULL
在这种情况下,我们将加入Col 2 = ColA和Col3 = ColB,并获得两个ID。 如果Log_Date <= End_Date,我需要ID = 1,如果Log_Date> End_Date,我需要ID = 2。
通常,我会有类似上面的内容,在表2中的两行会得到一个匹配项,其中一个End_Date将为NULL。
感谢您的帮助!
P.S。除非有更好的方法,否则此检查将是插入语句的一部分?
编辑:为进一步清楚起见,在上面的示例中,我们假设这些是记录:
Col1 | Col2 | Col3 | Log_Date
123 | 345 | 456 | 2018-09-01
123 | 345 | 456 | 2018-09-05
123 | 345 | 456 | 2018-09-09
123 | 345 | 456 | 2018-09-15
123 | 345 | 456 | 2018-10-01
123 | 345 | 456 | 2018-10-15
然后我在Col1 = ColA和Col2 = ColB上将它们与Table2结合在一起
结果:
Col1 | Col2 | Col3 | Log_Date | ID |ColA | ColB | Start_Date | End_Date
123 | 345 | 456 | 2018-09-01 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-01 | 2 | 123 | 345 | 2018-09-29 | NULL
123 | 345 | 456 | 2018-09-05 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-05 | 2 | 123 | 345 | 2018-09-29 | NULL
123 | 345 | 456 | 2018-09-09 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-09 | 2 | 123 | 345 | 2018-09-29 | NULL
123 | 345 | 456 | 2018-09-15 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-15 | 2 | 123 | 345 | 2018-09-29 | NULL
123 | 345 | 456 | 2018-10-01 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-10-01 | 2 | 123 | 345 | 2018-09-29 | NULL
123 | 345 | 456 | 2018-10-15 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-10-15 | 2 | 123 | 345 | 2018-09-29 | NULL
我要从中插入的是:
Col1 | Col2 | Col3 | Log_Date | ID |ColA | ColB | Start_Date | End_Date
123 | 345 | 456 | 2018-09-01 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-05 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-09 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-09-15 | 1 | 123 | 345 | 2018-08-28 | 2018-09-29
123 | 345 | 456 | 2018-10-01 | 2 | 123 | 345 | 2018-09-29 | NULL
123 | 345 | 456 | 2018-10-15 | 2 | 123 | 345 | 2018-09-29 | NULL
答案 0 :(得分:0)
这在黑暗中有点刺伤,但我认为这就是你所追求的。您的逻辑不完整,因为您似乎也需要包含Start_Date
。结果,我不知道这是否是真正的正确答案:
SELECT Col1,Col2,Col3,CONVERT(date,Log_Date) AS Log_Date
INTO dbo.Table1
FROM (VALUES(123,345,456,'20180901'),
(123,345,456,'20180905'),
(123,345,456,'20180909'),
(123,345,456,'20180915'),
(123,345,456,'20181001'),
(123,345,456,'20181015'))V(Col1,Col2,Col3,Log_Date);
SELECT ID,ColA,ColB,CONVERT(date,Start_Date) AS Start_Date,CONVERT(date,End_Date) AS End_Date
INTO dbo.Table2
FROM (VALUES(1,123,345,'20180828','20180929'),
(2,123,345,'20180929',NULL)) V(ID,ColA,ColB,Start_Date,End_Date)
GO
SELECT *
FROM dbo.Table1 T1
JOIN dbo.Table2 T2 ON T1.Col1 = T2.ColA
AND T1.Col2 = T2.ColB
AND ((T1.Log_Date <= T2.End_Date AND T2.ID = 1)
OR (T1.Log_Date >= T2.Start_Date AND (T1.Log_Date > T2.End_Date OR T2.End_Date IS NULL) AND T2.ID = 2));
GO
DROP TABLE dbo.Table1;
DROP TABLE dbo.TAble2;