Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:为结束日期添加计算列_Sql_Sql Server_Tsql_Datetime_Calculated Columns - Fatal编程技术网

SQL Server:为结束日期添加计算列

SQL Server:为结束日期添加计算列,sql,sql-server,tsql,datetime,calculated-columns,Sql,Sql Server,Tsql,Datetime,Calculated Columns,我有一个数据集,该数据集不断更新,日期值如下所示: Part Number Product Status Phase1 Phase2 Phase3 Phase4 Phase5 Phase6 FD 2000 Maintain 2020-01-03 00:00:00.000 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000 2020-01-3

我有一个数据集,该数据集不断更新,日期值如下所示:

Part Number Product Status  Phase1  Phase2  Phase3  Phase4  Phase5  Phase6
FD 2000 Maintain    2020-01-03 00:00:00.000 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000 2020-01-31 00:00:00.000
FD 2001 Maintain    2020-01-03 00:00:00.000 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000 2020-01-31 00:00:00.000
基本上,该表由零件号及其各自的状态和生命周期日期组成

然后,我利用
交叉应用
将不同的相位列转换为一列。以下是SQL语法:

SELECT [Part Number], [Product Status], Phase, Date
FROM PLCMexample
CROSS APPLY (VALUES ('Phase1', [Phase1]),
                    ('Phase2', [Phase2]),
                    ('Phase3', [Phase3]),
                    ('Phase4', [Phase4]),
                    ('Phase5', [Phase5]),
                    ('Phase6', [Phase6]))
            CrossApplied (Phase, Date)
GO
这将生成以下视图:

Part Number Product Status  Phase   Date
FD 2000     Maintain    Registration Initiation 2020-01-03 00:00:00.000
FD 2000     Maintain    Product Launch  2020-01-08 00:00:00.000
FD 2000     Maintain    Phase Out   2020-01-15 00:00:00.000
FD 2000     Maintain    Last Order  2020-01-17 00:00:00.000
FD 2000     Maintain    Last Shipment   2020-01-22 00:00:00.000
FD 2000     Maintain    Last Service    2020-01-31 00:00:00.000
FD 2001     Maintain    Registration Initiation 2020-01-03 00:00:00.000
FD 2001     Maintain    Product Launch  2020-01-08 00:00:00.000
FD 2001     Maintain    Phase Out   2020-01-15 00:00:00.000
FD 2001     Maintain    Last Order  2020-01-17 00:00:00.000
FD 2001     Maintain    Last Shipment   2020-01-22 00:00:00.000
FD 2001     Maintain    Last Service    2020-01-31 00:00:00.000
这很好,但现在我不仅需要视图的
Date
列,还需要
StartDate
EndDate
StartDate
将是当前
Date
列中的值。
结束日期
将与下一阶段的
开始日期
相同。以下是视图的前六行,作为其外观示例:

Part Number Product Status  Phase   StartDate   EndDate
FD 2000 Maintain    Registration Initiation 2020-01-03 00:00:00.000 2020-01-08 00:00:00.000
FD 2000 Maintain    Product Launch  2020-01-08 00:00:00.000 2020-01-15 00:00:00.000
FD 2000 Maintain    Phase Out   2020-01-15 00:00:00.000 2020-01-17 00:00:00.000
FD 2000 Maintain    Last Order  2020-01-17 00:00:00.000 2020-01-22 00:00:00.000
FD 2000 Maintain    Last Shipment   2020-01-22 00:00:00.000 2020-01-31 00:00:00.000
FD 2000 Maintain    Last Service    2020-01-31 00:00:00.000 2020-01-31 00:00:00.000
如您所见,“注册启动”
EndDate
与“产品发布”的
StartDate
相同。最后一个阶段“最后一次服务”将具有相同的
StartDate
EndDate


最好的处理方法是什么?我应该在换位之前还是之后创建计算列?这只是一个片段,有数千行这样的数据,因此我想优化代码。

我想您需要
lead()

编辑:

如果需要默认值,请使用三参数形式的
LEAD()


这太棒了!它运行得很好。唯一的警告是最后阶段。因为接下来没有任何内容,所以它在该列中放置NULL。是否可以将该结束日期设置为开始日期后的一段时间?@sykfarhan
ISNULL(提前期(日期)超过(按日期[零件号]顺序划分),DATEADD(日期,您想要的编号,日期))作为下一个日期
您可以这样做,我建议将数据类型更改为日期,因为看起来您没有使用DATETIME(DATETIME2)的time元素。它会让它更干净。
SELECT [Part Number], [Product Status], Phase, Date,
       LEAD(Date) OVER (PARTITION BY [Part Number] ORDER BY Date) as Next_Date
FROM PLCMexample CROSS APPLY
     (VALUES ('Phase1', [Phase1]),
             ('Phase2', [Phase2]),
             ('Phase3', [Phase3]),
             ('Phase4', [Phase4]),
             ('Phase5', [Phase5]),
             ('Phase6', [Phase6])
     ) CrossApplied (Phase, Date);
       LEAD(Date, 1, DATEADD(DAY, 100, DATE) OVER (PARTITION BY [Part Number] ORDER BY Date) as Next_Date