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;
表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;