加入就是问这个,因为它杀了我:)很棒的论坛,有很多伟大的思想!
我只需要加入这两个表,我只能在日期和时间加入它们,没有其他列可用。
表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
等等......
答案 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
结果如下:
答案 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