MSSQL - 日期范围

MSSQL - Date Range

表1

事件 1:事件 1 名称

event1_date:事件日期

表2

事件 2:事件 2 名称

event2_date:事件日期

事件 1:事件 1 名称

我已经尝试了在网上找到的几种语法,但 none 提供了我所需要的。通俗地说,这就是我需要的:

如果表 2 中的事件发生在表 1 中任何事件的 7 天内,则在事件 1 字段中添加事件的名称。

编辑评论:

我尝试了什么,为什么没有效果? 五天来,我一直在努力让它发挥作用。我不知道我尝试了多少种不同的语法。今天凌晨 3 点,我有点生气地删除了所有笔记,所以我无法提供我尝试过的列表。

下面提供了小样本 table。

表 1

事件 1 event1_date
事件 1 2020 年 1 月 1 日
事件 2 2020 年 1 月 15 日
事件 3 2020 年 2 月 1 日
事件 4 2020 年 2 月 20 日

表 2

事件 2 event2_date 事件 1
活动 2.1 2020 年 1 月 10 日
活动 2.2 2020 年 1 月 11 日
活动 2.3 2020 年 1 月 16 日 事件 2
活动 2.4 2020 年 2 月 25 日 事件 4

7 天前 AND/OR 事件的未来 7 天从 table 1?

table2 列 event2 中的点符号 - 是必需的,如果在该时间范围内有多个事件(另一行,或在 table 2、事件1列?

**目前不在 SQL 框....但这可能会有所帮助

SET NOCOUNT ON;  

DECLARE @event2_date   datetime
DECLARE @outtext       nvarchar(100)
DECLARE @prior7        datetime
DECLARE @after7        datetime

DECLARE event2_cursor CURSOR FOR SELECT event2_date FROM table2;

OPEN event2_cursor  

FETCH NEXT FROM event2_cursor INTO @event2_date  

  WHILE @@FETCH_STATUS = 0  
    BEGIN  

  set @prior7 = dateadd(DD, -7, @event2_date);
  set @after7 = dateadd(DD, 7, @event2_date);

  set @outtext = select event1_text from table1 where event1_date 
  BETWEEN @prior7 AND @after7

  print @outtext

END   
CLOSE event2_cursor;  
DEALLOCATE event2_cursor;  

这应该可以通过包含子查询的单个 UPDATE 语句来实现。示例如下。

注意 1:您可能在 Table2 中的行之后的 7 天内在 Table1 中有多个行。我通过按日期差异对重复项进行排序并放入第一个来处理此问题。

注 2:如果 x 在 y 之后,DATEDIFF(day, x, y) 给出负结果。如果您只需要前 7 天或后 7 天的值,而不是两者都需要,则需要将 BETWEEN 子句中的一个值设置为 0。

set dateformat MDY;

create table Table1 
(
    event1 nvarchar(max),
    event1_date date
);

create table Table2 
(
    event2 nvarchar(max),
    event2_date date,
    event1 nvarchar(max)
);

insert into 
    Table1
values 
    ('Event 1', '1/1/2020'),
    ('Event 2', '1/15/2020'),
    ('Event 3', '2/1/2020'),
    ('Event 4', '2/20/2020');

select 
    *
from
    Table1;

insert into 
    Table2
values 
    ('Event 2.1', '1/10/2020', null),
    ('Event 2.2', '1/11/2020', null),
    ('Event 2.3', '1/16/2020', null),
    ('Event 2.4', '2/25/2020', null);

select
    *
from
    Table2;

update 
    Table2
set 
    event1 = (
        select top 1 
            Table1.event1
        from
            Table1
        WHERE
            DATEDIFF(day, Table1.event1_date, Table2.event2_date) between -7 and 7
        order by
            DATEDIFF(day, Table1.event1_date, Table2.event2_date)
    );

select 
    *
from
    Table2;