用于连接表的SQL查询 - 其中一个表的日期时间与其他表的日期时间不匹配

时间:2016-10-06 22:05:51

标签: sql-server datetime

加入就是问这个,因为它杀了我:)很棒的论坛,有很多伟大的思想!

我只需要加入这两个表,我只能在日期和时间加入它们,没有其他列可用。

表1例如有以下列

电影-----------------日期时间.................................持续时间(分钟)

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

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

表2包含以下列

日期----------------时间

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

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

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

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

......等等

表2包含每分钟的信息,但表1仅包含每个事件的特定时间和日期。所以我需要匹配表二中的每一分钟与我从表一中得到的东西。

有什么想法吗?我会采取任何有效的方法:)对不起格式化!

编辑: 期望的结果将类似于

TITANIC ------------ 2016-01-01 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

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

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

等等......

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分: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