【发布时间】:2020-04-03 15:54:35
【问题描述】:
表 1 有开放时间。
id | OpenTime
1 | 2019-12-02 16:52:42.9130000
1 | 2019-12-02 16:55:57.5560000
1 | NULL
1 | 2019-12-02 16:59:09.5640000
1 | 2019-12-02 17:01:35.3510000
2 | 2019-12-02 17:02:55.0270000
2 | 2019-12-02 17:05:41.3930000
2 | 2019-12-02 17:07:41.7870000
表 2 有关闭时间。
id | CloseTime
1 | NULL
1 | 2019-12-02 16:56:19.2560000
1 | 2019-12-02 16:57:47.5790000
1 | 2019-12-02 16:59:33.5390000
1 | 2019-12-02 17:01:55.6040000
2 | 2019-12-02 17:04:00.7780000
2 | 2019-12-02 17:06:04.4830000
我需要为每个打开到关闭时间进行DATEDIFF 计算。
一次只能打开一次,但是我们可能会错过该活动。
我们可能还没有结束活动。
一个 OpenTime 通常会有一个对应的 CloseTime,其中 CloseTime 大于 OpenTime,但小于下一个 OpenTime。
id | OpenTime | CloseTime | Datedif
1 | 2019-12-02 16:52:42.9130000 | NULL | NULL
1 | 2019-12-02 16:55:57.5560000 | 2019-12-02 16:56:19.2560000 |
1 | NULL | 2019-12-02 16:57:47.5790000 | NULL
1 | 2019-12-02 16:59:09.5640000 | 2019-12-02 16:59:33.5390000 |
1 | 2019-12-02 17:01:35.3510000 | 2019-12-02 17:01:55.6040000 |
2 | 2019-12-02 17:02:55.0270000 | 2019-12-02 17:04:00.7780000 |
2 | 2019-12-02 17:05:41.3930000 | 2019-12-02 17:06:04.4830000 |
2 | 2019-12-02 17:07:41.7870000 | NULL | NULL
Datediff 只需几秒钟即可DATEDIFF(SECOND,OpenTime,CloseTime)。
DROP TABLE IF EXISTS #NEWTABLE;
SELECT
a.ID,
MAX(a.OpenTime) as OpenTime,
MIN(b.CloseTime) as CloseTime ,
DATEDIFF(SECOND, a.OpenTime, b.CloseTime) AS diffSeconds
INTO #NEWTABLE
FROM Table1 a
JOIN Table2 b
ON a.Id= b.Id
WHERE
a.Id = b.ID
and b.CloseTime> = a.OpenTime
Group by a.Id,DATEDIFF(SECOND, a.OpenTime, b.CloseTime)
order by diffSeconds desc
这不起作用,但我已尝试确保获得每个 OpenTime 的正确对应 CloseTime。我的代码为 8 个打开和关闭事件提供了 26 行输出。
【问题讨论】:
标签: sql sql-server join merge union