簡體   English   中英

MSSQL - 日期范圍

[英]MSSQL - Date Range

表格1

event1:事件 1 名稱

event1_date:事件日期

表2

event2:事件 2 名稱

event2_date:事件日期

event1:事件 1 名稱

我嘗試了幾種在線找到的語法,但都沒有提供我所需要的。 用外行的話來說,這就是我需要的:

如果表 2 中的事件發生在表 1 中任何事件的 7 天內,則在事件 1 字段中添加事件名稱。

編輯評論:

我試過什么,為什么它不起作用? 我一直試圖讓它工作五天。 我不知道我嘗試了多少種不同的語法。 今天凌晨 3 點,我有點憤怒地刪除了所有筆記,因此我無法提供我嘗試過的內容的列表。

下面提供了小樣本表。

表格1

事件1 event1_date
活動一 1/1/2020
活動二 1/15/2020
活動三 2/1/2020
活動四 2/20/2020

表2

事件2 event2_date 事件1
事件 2.1 1/10/2020
事件 2.2 1/11/2020
事件 2.3 1/16/2020 活動二
事件 2.4 2/25/2020 活動四

表 1 中事件發生前 7 天和/或未來 7 天?

表 2 事件 2 列中的點符號 - 如果在該時間范圍內有多個事件(另一行,或在表 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:在表 2 中的行之后的 7 天內,表 1 中的行可能不止一行。 我已經通過按日期差異對重復項進行排序並放入第一個來處理此問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM