首页 > 解决方案 > 如何使用每周计划状态表创建显示计划开始和结束日期的表格

问题描述

有人可以在 SQL Server 中使用 T-SQL 帮助我解决以下问题吗?

我的原始表格显示了一家公司的计划每周状态:该计划是在市场上还是在市场上。表结构如下:

ProgramID Status Sunday
1         1      1/3/2016
1         1      1/10/2016
1         0      1/17/2016
1         1      1/24/2016
2         0      1/3/2016
2         1      1/10/2016
2         1      1/17/2016
2         0      1/24/2016

我想创建一个如下表。当 ProgramID 1 投放市场时,我使用第 1 行完成记录(Program ID = 1, StartSunday = 1/3/2016, EndSaturday = NULL)。然后,程序 1 于 2016 年 1 月 17 日下架。所以,我在第一行填写了 EndSaturday 值“2016 年 1 月 16 日”。当 ProgramID 2 不在市场上时,我不会开始记录它(注意我有 ProgramID = 2 Status = 0 Sunday = 1/3/2016)。当 ProgramID 2 于 2016 年 1 月 10 日首次投放市场时,我开始记录我们为 ProgramID 1 所做的记录(ProgramID = 1,StartSunday = 1/10/2016,EndSaturday = Null)。当程序于 2016 年 1 月 24 日上市时,我更新了第 3 行的记录,ProgramID = 2,StartSunday = 1/10/2016,EndSaturday = 1/23/2016。

ProgramID   StartSunday   EndSaturday
1           1/3/2016      1/16/2016
1           1/24/2016     NULL
2           1/10/2016     1/23/2016

这个问题和帖子一样:Manipulate Login Logout data with T-SQL in SQL Server

但是,我的数据还有一行:(1,CONVERT(datetime2(7),'9/1/13 15:00', 1), 1),这意味着某些程序一开始不在系统中。然后,代码不再起作用。

如果存在则删除表 T;

创建表 T(UserID int, EventTime datetime2(7), [Event] bit)

插入 T(用户 ID、事件时间、事件)

价值观

(1,CONVERT(datetime2(7),'9/1/13 15:00', 1), 1),

(1,CONVERT(datetime2(7),'9/1/13 15:33', 1), 0),

(1,CONVERT(datetime2(7),'9/1/13 17:00', 1), 0),

(1,CONVERT(datetime2(7),'9/1/13 18:00', 1), 0),

(1,CONVERT(datetime2(7),'9/1/13 18:20', 1), 1),

(1,CONVERT(datetime2(7),'9/1/13 18:30', 1), 1),

(1,CONVERT(datetime2(7),'9/2/13 11:05', 1), 0),

(1,CONVERT(datetime2(7),'9/2/13 11:45', 1), 1),

(1,CONVERT(datetime2(7),'9/2/13 13:50', 1), 0),

(2,CONVERT(datetime2(7),'9/1/13 16:15', 1), 0),

(2,CONVERT(datetime2(7),'9/1/13 17:00', 1), 1),

(2,CONVERT(datetime2(7),'9/1/13 18:01', 1), 0),

(2,CONVERT(datetime2(7),'9/1/13 18:02', 1), 0),

(2,CONVERT(datetime2(7),'9/1/13 19:02', 1), 1),

(3,CONVERT(datetime2(7),'9/1/13 15:10', 1), 1),

(3,CONVERT(datetime2(7),'9/1/13 17:10', 1), 0),

(3,CONVERT(datetime2(7),'9/1/13 19:10', 1), 1),

(3,CONVERT(datetime2(7),'9/2/13 21:01', 1), 0)

从 T 中选择 *

按用户 ID、事件时间、事件排序

标签: sql-servertsql

解决方案


创建表的代码:

CREATE TABLE MarketRecord (  
    ProductID VARCHAR(10) NOT NULL,  
    Status BIT DEFAULT(0),  
    StartDate DATE NOT NULL  
    EndDate DATE NOT NULL 
)

您将更新您的表格并更改产品的状态:

UPDATE MarketRecord  
SET Status = 1  
WHERE PtoductID = <some item>

然后,您将使用对状态更改做出反应的 FOR UPDATE TRIGGER:

CREATE TRIGGER trgChangeStatus 
ON MarketRecord 
AFTER UPDATE 
AS 

BEGIN  
    UPDATE MarketRecord  
    SET EndDate = GETDATE()  
    FROM MarketRecord  
    INNER JOIN inserted i  
        ON ProductID = i.ProductID    
END

推荐阅读