如何根据记录所属的日期范围使用log_date插入记录

时间:2019-06-19 20:33:52

标签: sql sql-server conditional-statements

我有一条记录和该记录的关联日志日期。 我想根据它属于第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

1 个答案:

答案 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;