调整开始和结束日期

Posted

技术标签:

【中文标题】调整开始和结束日期【英文标题】:Adjusting start and end dates 【发布时间】:2020-09-24 00:33:31 【问题描述】:
Given a data set in MS SQL Server 2016

 StoreID PurchaseID ShopID LocationID Starttime          Endtime
 1020    20200102    9856  0010    2020-01-08 09:08:53  2020-01-08 09:11:52
 1021    20200102    9856  0020    2020-01-08 09:09:48  2020-01-08 09:11:52
 1022    20200102    9856  0030    2020-01-09 09:08:53  2020-01-09 09:12:52 
 1023    20200102    9856  0040    2020-01-10 09:09:48  2020-01-10 09:13:52

这里的 StoreID 是主键。我正在寻找一个查询,它将第一条记录结束时间的值更改为下一条记录的开始时间中的值。准确地说,我需要查找同一天发生的 PurchaseID 和 shopkeeperID 组合的记录,其中位置 id 两者都不同,然后获取后面记录的开始时间并更新前一行结束时间的值。

注意:这里我只给出了两个样本大小,但在我的数据集中我有超过 2 个以上场景。

我希望此更改仅更新为仅在该特定日期发生的记录。逻辑不应该更新所有不在同一天发生的先前记录的结束日期。准确地说,我希望这个逻辑只更新那些在同一天生成的具有不同 LocationID 的实例。

CREATE TABLE [dbo].[TestTab1](
StoreID [int] NOT NULL,
PurchaseID [int] NOT NULL,
ShopID [int] NOT NULL,
LocationID [int] NOT NULL,
starttime [datetime] NOT NULL,
Endtime [datetime] NOT NULL,
) ON [PRIMARY]

INSERT INTO [TestTab1]
VALUES (1020,20200102,9856,0010,'2020-01-08 09:08:53','2020-01-08 09:11:52'),
(1021,20200102,9856,0020,'2020-01-08 09:09:48','2020-01-08 09:11:52'),
(1022,20200102,9856,0030,'2020-01-09 09:08:53','2020-01-09 09:11:52'),
(1023,20200102,9856,0040,'2020-01-10 09:09:48','2020-01-10 09:11:52')

Existing Data:
StoreID PurchaseID ShopID LocationID starttime Endtime
1020 20200102 9856 10 2020-01-08 09:08:53.000 2020-01-08 09:11:52.000
1021 20200102 9856 20 2020-01-08 09:09:48.000 2020-01-08 09:11:52.000
1022 20200102 9856 30 2020-01-09 09:08:53.000 2020-01-09 09:12:52.000
1023 20200102 9856 40 2020-01-10 09:09:48.000 2020-01-10 09:13:52.000

Final Result set:

StoreID PurchaseID ShopID LocationID starttime Endtime
1020 20200102 9856 10 2020-01-08 09:08:53.000 2020-01-08 09:09:48.000
1021 20200102 9856 20 2020-01-08 09:09:48.000 2020-01-08 09:11:52.000
1022 20200102 9856 30 2020-01-09 09:08:53.000 2020-01-09 09:12:52.000
1023 20200102 9856 40 2020-01-10 09:09:48.000 2020-01-10 09:13:52.000

【问题讨论】:

这个问题怎么比this更有趣? 同样的问题,但想提供更多关于示例表结构和示例数据的信息。 【参考方案1】:

我认为这就是您要查找的内容,但是您预期输出的最后两行的 EndTimes 没有意义,因为它们不在原始数据集中。但是试一试,看看它是否能满足您的需求:

UPDATE TestTab1
    SET Endtime = T2.NewEndDate
FROM TestTab1 T1
INNER JOIN
    (
        SELECT *,
        LEAD(Starttime,1,endtime) OVER (PARTITION BY ShopID, PurchaseID ,CAST(StartTime as DATE) ORDER BY StartTime) NewEndDate
        from TestTab1
    ) T2 on T1.StoreID = t2.StoreID
WHERE T2.NewEndDate <> T2.Endtime

编辑:

此查询仅考虑使用不同的位置。您可以调整最内层以使用 MIN 或 MAX StoreID,具体取决于您希望更新最早还是最新记录:

UPDATE TestTab1
    SET Endtime = T2.NewEndDate
FROM TestTab1 T1
INNER JOIN
    (
        SELECT T1.*,
            LEAD(T1.Starttime,1,endtime) OVER (PARTITION BY T1.ShopID, T1.PurchaseID ,CAST(T1.StartTime as DATE) ORDER BY T1.StartTime) NewEndDate
        FROM TestTab1 T1 
        INNER JOIN
            (SELECT MIN(StoreID) StoreID, PurchaseID, ShopID, LocationID, MAX(StartTime) StartTime
                FROM TestTab1
                GROUP BY PurchaseID, ShopID, LocationID
            ) t3  on t3.StoreID = t1.StoreID
    ) T2 on T1.StoreID = t2.StoreID
WHERE T2.NewEndDate <> T2.Endtime 

【讨论】:

以上是关于调整开始和结束日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在不改变位置的情况下调整同一行中的两个 React 日期选择器

NSDate.timeIntervalSinceDate 没有节时调整?

UITableView 在开始/结束更新调用调整高度后自动滚动到顶部

按索引调整数组大小

针对当前时区调整的不同夏令时的UTC日期[重复]

调整 Pandas 中的每月时间序列数据