SQL的持续时间

时间:2018-09-11 04:44:48

标签: sql sql-server-2008

我有时间长度:

11-09-2018 10:00 AM - 11-09-2018 12:00 PM
11-09-2018 4:00 PM  - 11-09-2018 8:00 PM

我需要编写一个SQL查询以得出2018年11月9日的其他剩余时间。我的查询输出应为:

11-09-2018 12:00 AM - 11-09-2018 9:59 AM
11-09-2018 12:01 PM - 11-09-2018 3:59 PM
11-09-2018 08:01 PM - 11-09-2018 11:59 PM

2 个答案:

答案 0 :(得分:0)

请一般使用此选项来满足您的要求,当您要提供任何日期或日期时间作为输入并希望如上给出输出时非常有用,那么您可以使用以下查询。将任何日期或datetime(timestamp)替换为getdate(),您将获得所需的输出。

打印转换(VARCHAR,dateadd(hh,00,datediff(dd,0,GETDATE())),100)+'-'+ CONVERT(VARCHAR,dateadd(mi,59,dateadd(hh,09,datediff) (dd,0,GETDATE())),100)+''+ char(13)+ char(10)+ CONVERT(VARCHAR,dateadd(mi,01,dateadd(hh,12,datediff(dd,0, GETDATE()))),100)+'-'+ CONVERT(VARCHAR,dateadd(mi,59,dateadd(hh,15,datediff(dd,0,GETDATE()))),100)+''+ char (13)+ char(10)+ CONVERT(VARCHAR,dateadd(mi,01,dateadd(hh,20,datediff(dd,0,GETDATE())))),100)+'-'+ CONVERT(VARCHAR,dateadd (mi,59,dateadd(hh,23,datediff(dd,0,GETDATE()))),100)

答案 1 :(得分:0)

由于您尚未提供DDL,因此我不会编写查询,但会为您提供一种可以使用的方法。

您需要执行某种UNION来考虑以下事实:您可能需要在第一行之前和最后一行之后都创建行。

一种实现方法是“在每个现有行之前生成一行,并与最后一行合并”

使用自联接(OUTER)来获取对上一行的引用,在上一行end time之后的一分钟内选择start time(COALESCE NULL,'12 AM'),然后当前行的start time前1分钟为end time。使用WHERE子句过滤掉start time为'12:00 AM'的任何行。

这将为您表中的每一行提供所需的时间范围。

然后与最后一行保持联盟,最后一行由最后一个end time作为start time和'11:59 PM'作为end time之后的一分钟组成。如果最后一个end time是'11:59 PM',请使用WHERE子句将此行过滤掉。