2016-10-06 71 views
0

加入只是爲了問這是因爲它正在殺死我:)偉大的論壇,有很多偉大的思想!SQL查詢加入表 - 其中一個表的日期時間與其他表不匹配

我只需要加入這兩個表,我只能加入他們的日期和時間沒有其他列可用。

表1具有例如以下的列

電影-----------------日期時間.................................持續時間(分鐘)

TITANIC ------------ 2016年1月1日01:00:00 ----------------- 60

Armageddon --------- 2016-01-01 02:00:00 ----------------- 60

表2有以下列

日期----------------時間

2016年1月1日......... 0.01:00:00

2016-01- 01 ......... 0.01:01:00

2016年1月1日......... 0.01:02:00

2016年1月1日......... 0.01:03:00

...等等

表2包含每分鐘的信息,但表格1僅包含每個事件的特定時間和日期。所以我需要在表二中與表1中的每一分鐘相匹配。

任何想法?我會採取任何行之有效的:) btw對不起,格式化!

編輯: 期望的結果會是這樣的

TITANIC ------------ 2016年1月1日01:00:00 ---------- ------- 60

TITANIC ------------ 2016-01-01 01:01:00 --------------- --60

TITANIC ------------ 2016-01-01 01:02:00 ----------------- 60

世界末日--------- 2016-01-01 02:00:00 ----------------- 60

大決戰--------- 2016-01-01 02:01:00 ----------------- 60

大決戰----- ---- 2016年1月1日2時02分00秒60 -----------------

等等......

+0

能否請您詳細闡述其結果將是什麼樣子與您現有的樣本數據? – jyao

+0

持續時間將循環增加一分鐘的日期時間,持續時間值的分鐘數。或者添加另一列作爲「Endtdatetime」,例如(datetime_column + duration_column)AS Endtdatetime –

回答

0

我會作出一些假設你有沒有概述了表格結構。

你的電影表如下結構:

CREATE TABLE Films ([Film] NVARCHAR(128), [DateTime] DATETIME, Duration INT) 
GO 

您的日期/時間值表如下結構:

CREATE TABLE DateTimeValues ([Date] DATE, [Time] TIME) 
GO 

讓插入你的價值觀:

--Insert Values for Films 
INSERT INTO Films 
VALUES ('TITANIC', '2016-01-01T01:00:00', 60), 
     ('Armageddon', '2016-01-01 02:00:00', 60) 

GO 

--Insert Values for every minute of 2016-01-01 
DECLARE @DATETIMEBEGIN DATETIME 
SET @DATETIMEBEGIN = '2016-01-01' 
DECLARE @DATETIMEEND DATETIME 
SELECT @DATETIMEEND = '2016-01-02' 

;WITH CTE AS (SELECT DATEADD(day, 0, DATEDIFF(day, 0, @DATETIMEBEGIN)) DateTimeValues 
       UNION ALL 
       SELECT DATEADD(MINUTE, 1, DateTimeValues) AS DateTimeValues 
       FROM CTE 
       WHERE DateTimeValues < @DATETIMEEND 
      ) 
INSERT INTO DateTimeValues 
SELECT CONVERT(DATE, DateTimeValues) "Date", 
     CONVERT(TIME, DateTimeValues) "Time" 
FROM CTE 
OPTION (MAXRECURSION 0) 
GO 

讓我們簡單一點,根據硬腦膜計算每部電影的開始時間/結束時間灰。您將需要爲所需輸出的查詢是:

;WITH CTEFilms AS 
(
    SELECT Film, 
      CONVERT(DATE, [DateTime]) "Date", 
      CONVERT(TIME, [DateTime]) "StartTime", 
      CONVERT(TIME, DATEADD(MINUTE,Duration,[DateTime])) "EndTime", 
      Duration 
    FROM Films 
) 

SELECT  f.Film, 
      CAST(dtv."Date" AS DATETIME) + dtv."Time" "DateTime", 
      Duration 
FROM  CTEFilms f 
INNER JOIN DateTimeValues dtv 
      ON f.[Date] = dtv.[Date] 
      AND dtv.[Time] >= f.StartTime 
      AND dtv.[Time] < f.EndTime 
ORDER BY Film, Time 

結果:

Film  DateTime    Duration 
Armageddon 2016-01-01 02:00:00.000 60 
Armageddon 2016-01-01 02:01:00.000 60 
Armageddon 2016-01-01 02:02:00.000 60 
Armageddon 2016-01-01 02:03:00.000 60 
Armageddon 2016-01-01 02:04:00.000 60 
... 
Armageddon 2016-01-01 02:55:00.000 60 
Armageddon 2016-01-01 02:56:00.000 60 
Armageddon 2016-01-01 02:57:00.000 60 
Armageddon 2016-01-01 02:58:00.000 60 
Armageddon 2016-01-01 02:59:00.000 60 
TITANIC  2016-01-01 01:00:00.000 60 
TITANIC  2016-01-01 01:01:00.000 60 
TITANIC  2016-01-01 01:02:00.000 60 
TITANIC  2016-01-01 01:03:00.000 60 
TITANIC  2016-01-01 01:04:00.000 60 
... 
TITANIC  2016-01-01 01:55:00.000 60 
TITANIC  2016-01-01 01:56:00.000 60 
TITANIC  2016-01-01 01:57:00.000 60 
TITANIC  2016-01-01 01:58:00.000 60 
TITANIC  2016-01-01 01:59:00.000 60 
1

轉換表2日期和時間到日期時間,並查看它是否在表1日期時間和日期時間+持續時間之間。

SELECT * 
FROM table1 t1 
     JOIN table2 t2 ON CAST(t2.Date AS DATETIME) 
          + CAST(t2.Time AS DATETIME) >= t1.Datetime 
          AND CAST(t2.Date AS DATETIME) 
          + CAST(t2.Time AS DATETIME) < DATEADD(MIN, 
                   t1.Duration, 
                   t1.Datetime) 
0

@Eddie B,你沒有給出你的表格結構,即列的數據類型,所以我就想出了以下假設代碼/數據

use tempdb 
drop table dbo.t1, dbo.t2; 
create table dbo.T1 (film varchar(10), dt datetime, duration int) 
create table dbo.T2 (dt varchar(10), tm varchar(10)); 
go 

-- populate the tables with SOME sample data 

insert into dbo.T1(film, dt, duration) 
values ('Titanic', '2016-01-01 01:00:00', 5), ('Amageddon', '2016-01-01 02:00:00', 4) 

insert into dbo.T2 (dt, tm) 
values 
    ('2016-01-01', '01:00:00') 
, ('2016-01-01', '01:01:00') 
, ('2016-01-01', '01:02:00') 
, ('2016-01-01', '01:03:00') 
, ('2016-01-01', '01:04:00') 
, ('2016-01-01', '01:05:00') 

, ('2016-01-01', '02:00:00') 
, ('2016-01-01', '02:01:00') 
, ('2016-01-01', '02:02:00') 
, ('2016-01-01', '02:03:00') 
, ('2016-01-01', '02:04:00') 
, ('2016-01-01', '02:05:00') 

, ('2016-01-01', '03:00:00'); 

go 

-- here is the result 
select t1.film, [DateTime]= convert(datetime, t2.dt + ' ' + t2.tm), t1.duration 
from dbo.t1 
inner join dbo.t2 
on convert(datetime, t2.dt + ' ' + t2.tm) >= t1.dt 
and convert(datetime, t2.dt + ' ' + t2.tm) <= dateadd(minute, t1.duration, t1.dt) 
go 

下面是結果:

enter image description here

+0

WOW,像一個魅力一樣工作。雖然我有一些問題加入,因爲t2的時間範圍在02-26小時之間,而不是正常的00-00,我很奇怪。我將如何解決這個問題? t1具有正常的00-00h,更新或選擇無關緊要... –

相關問題