调整开始和结束日期
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 没有节时调整?