Sql server 2005 TSQL:日期时间重叠和间隔值

Sql server 2005 TSQL:日期时间重叠和间隔值,sql-server-2005,tsql,Sql Server 2005,Tsql,需要帮助为此创建查询 Start | End 2009-01-01 06:00:00 | 2009-01-01 14:00:00 2009-01-01 06:00:00 | 2009-01-02 06:00:00 2009-01-02 07:00:00 | 2009-01-02 08:00:00 2009-01-03 06:00:00 | 2009-01-03 14:00:00 2009-01-03 09:00:00 | 2009-01-03 11:00:00 200

需要帮助为此创建查询

Start               | End
2009-01-01 06:00:00 | 2009-01-01 14:00:00
2009-01-01 06:00:00 | 2009-01-02 06:00:00
2009-01-02 07:00:00 | 2009-01-02 08:00:00
2009-01-03 06:00:00 | 2009-01-03 14:00:00
2009-01-03 09:00:00 | 2009-01-03 11:00:00
2009-01-04 22:00:00 | 2009-01-05 06:00:00
2009-01-05 01:00:00 | 2009-01-05 10:00:00
我想获取间隔的非重叠时间(
2009-01-01 00:00:00
-
2009-01-31 00:00:00
) 每天的金额如下:

Date       | Duration
2009-01-01 | 18
2009-01-02 | 7
2009-01-03 | 8
2009-01-04 | 2
2009-01-05 | 10
然后查找整个请求间隔的总和

您是否能够帮助构造此查询?

在sqlserver中签出。我不确定您使用的是什么db服务器,但我想其他RDBMS也会有类似的功能,或者足以让您创建自己的功能来实现这一点

SELECT start, DATEDIFF(hh, start, end) FROM ......
看起来我错过了其中的多次约会部分。要按天划分,我认为您几乎必须分别处理每条记录,并将其存储在临时表或其他什么东西中。也许您可以创建一个函数,为每个记录返回一个表,按日期分割持续时间,然后对每个日期进行汇总。?

在sqlserver中签出。我不确定您使用的是什么db服务器,但我想其他RDBMS也会有类似的功能,或者足以让您创建自己的功能来实现这一点

SELECT start, DATEDIFF(hh, start, end) FROM ......
看起来我错过了其中的多次约会部分。要按天划分,我认为您几乎必须分别处理每条记录,并将其存储在临时表或其他什么东西中。也许您可以创建一个函数,为每个记录返回一个表,按日期分割持续时间,然后对每个日期进行求和。?

尝试以下方法:

WITH Times AS (
        SELECT DISTINCT(Start) AS Time FROM intervals
        UNION ALL
        SELECT DISTINCT([End]) AS Time FROM intervals),
     Days AS (SELECT DISTINCT DATEADD(dd, 0, DATEDIFF(dd, 0, Time)) AS Time FROM Times),
     Times2 AS (
        SELECT Time FROM times
        UNION ALL
        SELECT Time FROM days),
     Times3 AS (SELECT ROW_NUMBER() OVER (ORDER BY Time) AS rn, Time FROM Times2),
     Times4 AS (
        SELECT T1.Time AS Start, T2.Time AS [End]
        FROM Times3 T1
        JOIN Times3 T2
        ON T1.rn + 1 = T2.rn),
     IntervalParts AS (
         SELECT DISTINCT Times4.*
         FROM Times4
         JOIN intervals
         ON Times4.Start >= intervals.Start AND Times4.[End] <= intervals.[End]),
     IntervalsByDay AS (
         SELECT 
             DATEADD(dd, 0, DATEDIFF(dd, 0, Start)) AS Day,
             DATEDIFF(hh, Start, [End]) AS Duration 
         FROM IntervalParts)
SELECT Day, SUM(Duration) AS Duration
FROM IntervalsByDay
GROUP BY Day
要将其限制在某个范围内,只需添加适当的WHERE子句。

尝试以下操作:

WITH Times AS (
        SELECT DISTINCT(Start) AS Time FROM intervals
        UNION ALL
        SELECT DISTINCT([End]) AS Time FROM intervals),
     Days AS (SELECT DISTINCT DATEADD(dd, 0, DATEDIFF(dd, 0, Time)) AS Time FROM Times),
     Times2 AS (
        SELECT Time FROM times
        UNION ALL
        SELECT Time FROM days),
     Times3 AS (SELECT ROW_NUMBER() OVER (ORDER BY Time) AS rn, Time FROM Times2),
     Times4 AS (
        SELECT T1.Time AS Start, T2.Time AS [End]
        FROM Times3 T1
        JOIN Times3 T2
        ON T1.rn + 1 = T2.rn),
     IntervalParts AS (
         SELECT DISTINCT Times4.*
         FROM Times4
         JOIN intervals
         ON Times4.Start >= intervals.Start AND Times4.[End] <= intervals.[End]),
     IntervalsByDay AS (
         SELECT 
             DATEADD(dd, 0, DATEDIFF(dd, 0, Start)) AS Day,
             DATEDIFF(hh, Start, [End]) AS Duration 
         FROM IntervalParts)
SELECT Day, SUM(Duration) AS Duration
FROM IntervalsByDay
GROUP BY Day

限制在一定范围内,,只需添加一个适当的WHERE子句。

请求的间隔是否总是在相应日期的午夜开始和停止?您的表的名称是什么?请求的间隔是否总是在相应日期的午夜开始和停止?您的表的名称是什么?创建了tmp table@intervals并将@放入查询中,但得到了“Msg 137,级别15,状态2,第36行必须声明标量变量“@interval”。“ON Times4.Start>=interval.Start和Times4.[End]我不明白为什么要使用临时表。”。这似乎完全没有必要。您的数据不是在一个真实的表中吗?Temp只是用于测试。我将在真正的桌子上试一试。Temp table name是@interval。请注意,在我的查询中,您必须在许多地方将表名更改为实际的表名,否则将出现错误。如果您在问题中输入了表名,我本来可以为您这样做,为您节省一些工作并减少出错的可能性。下次提问时请记住包含表名。对不起,表名,这是我在本页上的第一个问题。对于示例表,它是有效的。如果我使用临时表,如果间隔大于1天的差异(2009-01-07 06:00:00 | 2009-01-10 14:00:00),有什么区别?创建tmp表@interval并将@放入查询中,但得到“Msg 137,级别15,状态2,第36行必须声明标量变量”@interval”。“ON Times4.Start>=interval.Start和Times4.[结束]我不明白您为什么要使用临时表。这似乎完全没有必要。您的数据不是在真实表中吗?临时表只是用于测试。将在真实表上尝试。临时表名称是@interval。请注意,在我的查询中,您必须在许多地方将表名更改为真实表名,否则您将出错。如果您输入了您的表格在您的问题中,我本来可以先为您这样做,为您节省一些工作并减少出错的可能性。请记住,下次您提问时请包含表格名称。对不起,表格名称,这是我在本页上的第一个问题。对于它工作的示例表格。如果我使用温度表和间隔是否大于1天差异(2009-01-07 06:00:00 | 2009-01-10 14:00:00)?