【问题标题】:SQL Server: Return columns in a specific time intervalSQL Server:在特定时间间隔内返回列
【发布时间】:2018-03-08 19:12:37
【问题描述】:

我想返回特定时间间隔之间的行,即 01:00:00 和 01:05:00 之间的行,然后计算另一列的总和。 列数据类型为 TIME。我尝试了 'between...and' 命令,但没有成功。

此外,我想每五分钟进行一次相同的计算。

编辑:

我的查询无效

select time
from dbo.table;
where time between'01:00:00' and '01:05:00'

错误消息:关键字“where”附近的语法不正确。

样本数据:

Time      ----- Team
01:00:00  ----- Liverpool
01:06:33  ----- Liverpool
01:04:00  ----- Man. United
01:02:17  ----- Man. City
01:01:00  ----- Man. City
01:07:15  ----- Liverpool

我的预期输出,我想成为这样的人

[01:00:00 - 01:05:00] ----- Man. City ----- 2
[01:00:00 - 01:05:00] ----- Liverpool ----- 1
[01:00:00 - 01:05:00] ----- Man. United ----- 1
[01:05:01 - 01:10:00] ----- Liverpool ----- 2

最后,我想要一个 2-3 小时的循环。

【问题讨论】:

  • 向我们展示您的无效查询。
  • 你的尝试到目前为止??任何样本数据???该样本数据的预期输出???
  • “我想每五分钟做一次同样的计算。”直到什么时候? 24 小时?
  • 对不起@TabAlleman 的帖子不足,我放的代码不起作用。
  • 删除dbo.table后的分号,然后再次尝试查询。

标签: sql-server sql-server-2017


【解决方案1】:

如果您使用between 定义时间范围,则该范围的上下点都包括在内。为了避免范围重叠,只需使用 >=< 的组合来定义时间范围。

select [time]
from dbo.table
where [time] >= '01:00:00' and [time] < '01:05:00'

当使用处理多个范围的 case 表达式时,这一点更为重要,因此它们是互斥的。

 Select
   case 
    when [time] >= '01:00:00' and [time] < '01:05:00' then  '[01:00:00 - 01:05:00]'
    when [time] >= '01:05:00' and [time] < '01:10:00' then  '[01:05:00 - 01:10:00]'
    ...
    end
From dbo.table

【讨论】:

    【解决方案2】:

    我毫不怀疑有一种方法可以计算您的时间间隔,但我必须搜索如何做到这一点。如果你的时间间隔是静态的,那么你可以创建一个这样的表:

    CREATE TABLE [dbo].[TimeIntervals](
        [Id] [INT] IDENTITY(1,1) NOT NULL,
        [TimeStart] [TIME](0) NOT NULL,
        [TimeEnd] [TIME](0) NOT NULL
    ) ON [PRIMARY]
    GO
    

    您的记录将如下所示:

    INSERT [dbo].[TimeIntervals] ([TimeStart], [TimeEnd]) VALUES (CAST(N'01:00:00' AS Time), CAST(N'01:05:00' AS Time))
    GO
    INSERT [dbo].[TimeIntervals] ([TimeStart], [TimeEnd]) VALUES (CAST(N'01:05:00' AS Time), CAST(N'01:10:00' AS Time))
    GO
    INSERT [dbo].[TimeIntervals] ([TimeStart], [TimeEnd]) VALUES (CAST(N'01:10:00' AS Time), CAST(N'01:15:00' AS Time))
    GO
    

    我还创建了一个表格来保存您的示例值:

    CREATE TABLE [dbo].[Times](
        [times] [TIME](7) NULL,
        [team] [VARCHAR](50) NULL
    ) ON [PRIMARY]
    GO
    
    INSERT [dbo].[Times] ([times], [team]) VALUES (CAST(N'01:00:00' AS Time), N'Liverpool')
    GO
    INSERT [dbo].[Times] ([times], [team]) VALUES (CAST(N'01:06:33' AS Time), N'Liverpool')
    GO
    INSERT [dbo].[Times] ([times], [team]) VALUES (CAST(N'01:04:00' AS Time), N'Man. United')
    GO
    INSERT [dbo].[Times] ([times], [team]) VALUES (CAST(N'01:02:17' AS Time), N'Man. City')
    GO
    INSERT [dbo].[Times] ([times], [team]) VALUES (CAST(N'01:01:00' AS Time), N'Man. City')
    GO
    INSERT [dbo].[Times] ([times], [team]) VALUES (CAST(N'01:07:15' AS Time), N'Liverpool')
    GO
    

    那么您的查询将如下所示:

    SELECT 
          ti.TimeStart
         ,ti.TimeEnd
         ,t.team
         ,COUNT(t.team)
    FROM dbo.Times t
        INNER JOIN dbo.TimeIntervals ti ON t.times BETWEEN ti.TimeStart AND ti.TimeEnd
    GROUP BY ti.TimeStart
        ,ti.TimeEnd
        ,t.team
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多