表中的T

编程入门 行业动态 更新时间:2024-10-28 15:23:19
表中的T-SQL日期范围拆分并将单个日期添加到表中(T-SQL date range in a table split and add the individual date to the table)

感谢您的帮助。 我有一张这样的桌子。 让我们称之为TableA

[Id] [CHAR](10) NOT NULL, [DType] [SMALLINT] NOT NULL, [PType] [CHAR](1) NOT NULL, [Period] [INT] NOT NULL, [FromDate] [SMALLDATETIME] NOT NULL, [ToDate] [SMALLDATETIME] NOT NULL, [Highval] [DECIMAL](19, 4) NULL,

主键是Id, DType, PType, Period, FromDate

其中有数据如下:

Id DType PType Period FromDate ToDate Highval ------------------------------------------------------------------- 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 000000000G 1 A 2015 2014-11-01 2014-11-01 1.2860 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 000000000K 4 3 2015 2014-12-15 2014-12-16 2.1700 000000000K 4 3 2015 2014-11-14 2014-12-14 2.7200

我需要一种方法来分割日期范围,任何大于或等于FromDate和小于或等于ToDate的东西,我需要将它们分成另一个名为IndividualDate列到同一个表中。 基本上,在给定的日期范围内,如果FromDate和ToDate之间存在日期,则在名为IndividualDate另一列中写入日期。 对于给定的Id , DType , PType , PEnd , FromDate , FromDate和ToDate字段日期范围没有重复项。 因此,日期范围完全分开。 上面的示例数据的最终输出表(临时表很好)将如下所示。

Id DType PType Period FromDate ToDate Highval IndividualDate ---------------------------------------------------------------------------------- 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 2014-11-02 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 2014-11-03 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 2014-11-04 000000000G 1 A 2015 2014-11-01 2014-11-01 1.2860 2014-11-01 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-28 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-29 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-30 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-31 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-17 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-18 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-19 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-20 000000000K 4 3 2015 2014-12-15 2014-12-16 2.1700 2014-12-15 000000000K 4 3 2015 2014-12-15 2014-12-16 2.1700 2014-12-16 000000000K 4 3 2015 2014-11-14 2014-12-14 2.7200 2014-12-14

任何建议将不胜感激。 先谢谢你。

Thank you for looking to help. I have a table like this. Lets call it TableA

[Id] [CHAR](10) NOT NULL, [DType] [SMALLINT] NOT NULL, [PType] [CHAR](1) NOT NULL, [Period] [INT] NOT NULL, [FromDate] [SMALLDATETIME] NOT NULL, [ToDate] [SMALLDATETIME] NOT NULL, [Highval] [DECIMAL](19, 4) NULL,

The Primary Key is Id, DType, PType, Period, FromDate

There is data in it like this:

Id DType PType Period FromDate ToDate Highval ------------------------------------------------------------------- 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 000000000G 1 A 2015 2014-11-01 2014-11-01 1.2860 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 000000000K 4 3 2015 2014-12-15 2014-12-16 2.1700 000000000K 4 3 2015 2014-11-14 2014-12-14 2.7200

I need a way to split the date ranges, anything greater than or equal to FromDate and less than or equal to ToDate, I need to split them into another column called IndividualDate into the same table. Basically, in the given date ranges, if the date exists between the FromDate and ToDate write the date in another column called IndividualDate. For a given Id, DType, PType, PEnd, FromDate, the FromDate and ToDate field date ranges do not have duplicates. So, the date ranges are cleanly separated. The final output table(temporary table is fine) for the above sample data would look like this.

Id DType PType Period FromDate ToDate Highval IndividualDate ---------------------------------------------------------------------------------- 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 2014-11-02 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 2014-11-03 000000000G 1 A 2015 2014-11-02 2014-11-04 0.4800 2014-11-04 000000000G 1 A 2015 2014-11-01 2014-11-01 1.2860 2014-11-01 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-28 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-29 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-30 000000000G 1 A 2015 2014-10-28 2014-10-31 1.2290 2014-10-31 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-17 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-18 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-19 000000000K 4 2 2015 2014-12-17 2014-12-20 2.5800 2014-12-20 000000000K 4 3 2015 2014-12-15 2014-12-16 2.1700 2014-12-15 000000000K 4 3 2015 2014-12-15 2014-12-16 2.1700 2014-12-16 000000000K 4 3 2015 2014-11-14 2014-12-14 2.7200 2014-12-14

Any suggestions would be greatly appreciated. Thank you in advance.

最满意答案

这个使用Tally Table 。 供参考: http : //www.sqlservercentral.com/articles/T-SQL/62867/

;WITH e1(N) AS( SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 ) ,e2(N) AS(SELECT 0 FROM e1 a, e1 b) ,e4(N) AS(SELECT 0 FROM e2 a, e2 b) ,Tally(N) AS( SELECT TOP(SELECT MAX(DATEDIFF(DAY, FromDate, ToDate) + 1) FROM TableA) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM e4 ) SELECT a.Id, a.Dtype, a.Ptype, a.Period, FromDate = CONVERT(VARCHAR(10), a.FromDate, 120), ToDate = CONVERT(VARCHAR(10), a.ToDate, 120), IndividualDate = CONVERT(VARCHAR(10), DATEADD(DAY, t.N -1, a.FromDate), 120) FROM TableA a CROSS JOIN Tally t WHERE t.N - 1 <= DATEDIFF(DAY, a.FromDate, a.ToDate) ORDER BY a.Id, a.DType, a.PType, a.Period, a.Highval, IndividualDate

This one uses a Tally Table. For reference: http://www.sqlservercentral.com/articles/T-SQL/62867/

;WITH e1(N) AS( SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 ) ,e2(N) AS(SELECT 0 FROM e1 a, e1 b) ,e4(N) AS(SELECT 0 FROM e2 a, e2 b) ,Tally(N) AS( SELECT TOP(SELECT MAX(DATEDIFF(DAY, FromDate, ToDate) + 1) FROM TableA) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM e4 ) SELECT a.Id, a.Dtype, a.Ptype, a.Period, FromDate = CONVERT(VARCHAR(10), a.FromDate, 120), ToDate = CONVERT(VARCHAR(10), a.ToDate, 120), IndividualDate = CONVERT(VARCHAR(10), DATEADD(DAY, t.N -1, a.FromDate), 120) FROM TableA a CROSS JOIN Tally t WHERE t.N - 1 <= DATEDIFF(DAY, a.FromDate, a.ToDate) ORDER BY a.Id, a.DType, a.PType, a.Period, a.Highval, IndividualDate

更多推荐

本文发布于:2023-07-05 01:13:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1031311.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!