【问题标题】:Determine a time interval确定时间间隔
【发布时间】:2016-03-03 10:24:11
【问题描述】:

我尝试在 SSRS 中创建一个图表,该图表应该只显示周日晚上 10 点到晚上 11 点的值。

我的查询:

select intervaldateweek as Week,
       SUM(GoodUnits) As GoodUnits,
       SUM(NetUnits) As NetUnits,
       SUM(GoodUnits)  / NULLIF(SUM(NetUnits) , 0.0)* 100 As Value
from Count
    inner join tsystem ON Count.systemid = tsystem.ID
where IntervalDate >= getdate()-300
  and tsystem.ID = 2 
group by intervaldate

我用这个表达式试了一下,只得到星期天:

(DATEPART(dw, IntervalDate) = 1

但我不知道如何确定具体的时间间隔。在这种情况下,晚上 10 点 - 晚上 11 点。

我需要这段时间之间的值

22:00:00 到 23:00:00 之间

 IntervalDate >= DATEADD(HOUR, 1,CAST(DATEADD(DAY,0, CAST(GETDATE() AS DATE)) AS DATETIME))
    AND IntervalDate <= DATEADD(HOUR, 22, CAST(CAST(GETDATE() AS DATE) AS DATETIME))

我用这个表达式尝试过,但我认为我在表达式中设置了错误的数字。

【问题讨论】:

    标签: sql sql-server reporting-services ssrs-2008-r2


    【解决方案1】:

    您可以使用DATEPART 函数 (documentation here) 查看相关部分,例如日期时间值的小时。例如:

    SELECT 
        intervaldateweek AS [Week],
        SUM(GoodUnits) AS GoodUnits,
        SUM(NetUnits) AS NetUnits,
        SUM(GoodUnits) / NULLIF(SUM(NetUnits), 0.0)* 100 AS Value
    FROM 
        [Count]
        INNER JOIN tsystem ON [Count].systemid = tsystem.ID
    WHERE 
        DATEPART(WEEKDAY,intervaldate) = 1 /* See note about SET DATEFIRST */
        AND DATEPART(HOUR, intervaldate) = 22
        AND tsystem.ID = 2
    GROUP BY
        intervaldateweek
    

    注意:使用DATEPART(WEEKDAY, ...) 函数时,请务必了解您的服务器配置,因为有时星期日为 1,有时星期日为 7。您可以使用例如 SET DATEFIRST 1 强制它使其可预测。详情请参考MSDN link

    PS:您的选择语句按intervaldate 分组,但您的列列表使用intervaldateweek,这是行不通的。我将假设 group by 是intervaldateweek

    【讨论】:

      【解决方案2】:

      您可以使用以下行..

      DATEPART(dw,GETDATE()) = 1 AND CAST(GETDATE() AS TIME(0)) BETWEEN CAST('22:00:00' AS TIME(0)) AND CAST('23:00:00' AS TIME(0))
      

      不需要使用那种东西。

      【讨论】:

      • 你是否替换了 GETDATE
      【解决方案3】:

      试试这个

       select intervaldateweek as Week,
         SUM(GoodUnits) As GoodUnits,
         SUM(NetUnits) As NetUnits,
         SUM(GoodUnits)  / NULLIF(SUM(NetUnits) , 0.0)* 100 As Value
      from Count
      inner join tsystem ON Count.systemid = tsystem.ID
      where DATEPART(dw,intervaldate) = 1 AND CAST(intervaldate AS TIME(0))
      BETWEEN CAST('22:00:00' AS TIME(0)) AND CAST('23:00:00' AS TIME(0))
      and tsystem.ID = 2
      group by intervaldate
      

      【讨论】:

      • 日期保存在数据库中,如下所示:“2016-02-22 22:00:00.000”
      • 你用的是什么版本?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多