根据日期条件增加价值

时间:2019-10-16 15:06:10

标签: sql sql-server tsql date

请参见下面的代码。对于介于HolidayUW_Date之间的每个UW_Date_Month_Start,我想创建一个名为new_int的新列,即UW_int +该月到目前为止所发生的假期数。

SELECT *
FROM [Table6]
LEFT JOIN [] ON Table6.Name = ??

原始表

Name    | UW_Date    | UW_Date_Month_Start | UW_int |
-----------------------------------------------------
Kim     | 9/4/2019   | 9/1/2019            | 3      |
Billy   | 9/10/2019  | 9/1/2019            | 7      |
Steve   | 10/21/2019 | 10/1/2019           | 5      |
Nicki   | 10/10/2019 | 10/1/2019           | 1      |


Holiday  |
-------- |
9/4/2019 |
9/1/2019 |
CREATE TABLE [Table6] ([Name] nvarchar(10), [UW_Date] datetime, [UW_Date_Month_Start] datetime, [UW_int] int)

INSERT INTO [Table6] VALUES ('Kim', '9/4/2019', '9/1/2019', 3)
INSERT INTO [Table6] VALUES ('Billy', '9/10/2019', '9/1/2019', 7)
INSERT INTO [Table6] VALUES ('Steve', '10/21/2019', '10/1/2019', 5)
INSERT INTO [Table6] VALUES ('Nicki', '10/10/2019', '10/1/2019', 1)

CREATE TABLE [Holiday_Table] ([Holiday] datetime)

INSERT INTO [Holiday_Table] VALUES ('9/7/2019')
INSERT INTO [Holiday_Table] VALUES ('10/15/2019')

最终输出:

Name    | UW_Date    | UW_Date_Month_Start | UW_int | new_int
--------------------------------------------------------------
Kim     | 9/4/2019   | 9/1/2019            | 3      | 3
Billy   | 9/10/2019  | 9/1/2019            | 7      | 8
Steve   | 10/21/2019 | 10/1/2019           | 5      | 6
Nicki   | 10/10/2019 | 10/1/2019           | 1      | 1

1 个答案:

答案 0 :(得分:3)

我将使用内联子查询来解决这个问题。这避免了聚合的需求,这在大量记录上可能会很昂贵。

此外,当在相应的时间间隔内没有假日记录存在时,子查询将返回0,因此不需要处理null(除非进行left join时除外)。

select
    t.*,
    t.UW_int + (
        select count(*) 
        from holiday_table h 
        where h.holiday between t.UW_Date_Month_Start and t.UW_Date
    ) new_int
from table6 t

Demo on DB Fiddle

Name  | UW_Date             | UW_Date_Month_Start | UW_int | new_int
:---- | :------------------ | :------------------ | -----: | ------:
Kim   | 04/09/2019 00:00:00 | 01/09/2019 00:00:00 |      3 |       3
Billy | 10/09/2019 00:00:00 | 01/09/2019 00:00:00 |      7 |       8
Steve | 21/10/2019 00:00:00 | 01/10/2019 00:00:00 |      5 |       6
Nicki | 10/10/2019 00:00:00 | 01/10/2019 00:00:00 |      1 |       1