当前位置: 首页 > 知识库问答 >
问题:

两个日期之间的SQL SUM小时数

郭恩
2023-03-14

我需要像这样显示一个月内和前一个月一个动作所用的总小时数:

 ___________________________________________
| Rank |  Action  |   Month    | Prev Month |
|------|----------|------------|------------|
| 1    | Action1  |      580.2 |      200.7 |
| 2    | Action8  |      412.5 |      550.2 |
| 3    | Action10 |      405.0 |       18.1 |
---------------------------------------------

我有一个SQL表,格式如下:

 _____________________________________________________
| Action  |     StartTime       |       EndTime       |
|---------|---------------------|---------------------|
| Action1 | 2015-02-03 06:01:53 | 2015-02-03 06:12:05 |
| Action1 | 2015-02-03 06:22:16 | 2015-02-03 06:25:33 |
| Action2 | 2015-02-03 06:36:07 | 2015-02-03 06:36:49 |
| Action1 | 2015-02-03 06:36:46 | 2015-02-03 06:48:10 |
| ..etc   | 20..-..-..   ...etc | 20..-..-..   ...etc |
-------------------------------------------------------

查询会是什么样子?

编辑:

ツ的答案让我朝着正确的方向前进,但是我使用JOIN解决了这个问题。请参阅下面的解决方案。

共有3个答案

董谦
2023-03-14

您可能应该检查对预处理数据的使用分组,如下所示:

select Action, SUM(Hours)
  from (select Action, DATEDIFF('hh',StartTime, EndTime) as Hours
  FROM Actions)
group by Action
贺高杰
2023-03-14

我只是在对SQLServer进行了更多的研究之后,重新考虑这个问题。

可以从一个查询中创建临时表,然后在另一个查询(如果需要,可以是嵌套查询)中使用
通过这种方式,结果可以像通过任何其他普通表一样JOIN在一起,而无需使用令人讨厌的CASE语句。这对于显示第一个查询所需的其他数据也很有用,例如COUNT(DISTINCT ColumnName)

连接两个选择语句结果

SELECT TOP 10
    t1.Action, t1.[Time],
    COALESCE(t2.[Time],0) AS [Previous Period 'Time'],
    COALESCE( ( ((t1.[Time]*1.0) - (t2.[Time]*1.0)) / (t2.[Time]*1.0) ), -1 ) AS [Change]
FROM 
    (
        SELECT 
            Action, 
            SUM(DATEDIFF(SECOND, StartTime, EndTime)) AS [Time],
        FROM Actions
        WHERE StartTime BETWEEN @start AND @end
        GROUP BY Action
    ) t1
LEFT JOIN
    (
        SELECT 
            Action, 
            SUM(DATEDIFF(SECOND, StartTime, EndTime)) AS [Time]
        FROM Actions
        WHERE StartTime BETWEEN @prev AND @start
        GROUP BY Action
    ) t2
ON
    t1.Action = t2.Action
ORDER BY t1.[Time] DESC

希望这些信息对某人有帮助。

鲁杜吟
2023-03-14

我改变了一些价值观,因为只有一天是相当无聊的

INSERT INTO yourtable
    ([Action], [StartTime], [EndTime])
VALUES
    ('Action1', '2015-02-18 06:01:53', '2015-02-18 06:12:05'),
    ('Action1', '2015-02-18 06:22:16', '2015-02-18 06:25:33'),
    ('Action2', '2015-04-03 06:36:07', '2015-04-03 06:36:49'),
    ('Action1', '2015-03-19 06:36:46', '2015-03-19 06:48:10'),
    ('Action2', '2015-04-13 06:36:46', '2015-04-13 06:48:10'),
    ('Action2', '2015-04-14 06:36:46', '2015-04-14 06:48:10')
;

现在定义日期边框:

declare @dateEntry datetime = '2015-04-03';

declare @date1 date
      , @date2 date
      , @date3 date;

set @date1 = @dateEntry;               -- 2015-04-03
set @date2 = dateadd(month,-1,@date1); -- 2015-03-03 
set @date3 = dateadd(month,-1,@date2); -- 2015-02-03 

所选日期将包括在2015-04-03 00:00之前开始并在2015-02-03 00:00之后开始的所有操作

select date1 = @date1 
     , date2 = @date2
     , date3 = @date3
     , [Action] 
     , thisMonth = 
       sum(
       case when Starttime between @date2 and @date1 
            then datediff(second, starttime, endtime)/360.0
       end)
     , lastMonth =
       sum(
       case when Starttime between @date3 and @date2
            then datediff(second, starttime, endtime)/360.0
       end)
  from yourtable 
  where starttime between @date3 and @date1
  group by [Action]

http://sqlfiddle.com/#!6/35784/5

 类似资料:
  • 在Symfony 2中有两个日期时间格式的字段。现在我想得到提交表单后的总小时数 实体php 显示html 这将抛出一个错误 在呈现模板期间引发异常(“DateTime::_construct()希望参数1为字符串,对象为给定的”)在。。。 你如何简单地得到同一天两个小时之间的小时数?

  • 问题内容: 我必须找到java中两个不同日期对象之间的时间差异,如果该时间超过5秒,我必须使会话无效。 这是场景: 我有一个jsp页面,它每5秒设置一次会话 我还有另一个jsp页面,每1秒访问一次, 现在,我必须在我提到的另一个jsp中进行比较,并使会话无效, 因此,如果差异超过5秒,则会话无效。 问题答案:

  • 问题内容: 我有两个这样的表: 表格1 表2 我想从 Table1中 选择并插入 Table2中 。 例如: 在表1中,我有这个 在表2中,我想要这个 带有样本数据的表结构 问题答案: 感谢您的架构。它使处理您的问题变得容易。我对您的架构进行了一些更改以利用auto_increment 在这里,我在emp_leave_daywise表上添加了唯一约束,因为id整数上的主键不能确保记录不重复。 em

  • 问题内容: 查看两个日期之间有多少整天的最短方法是什么?这就是我现在正在做的。 问题答案: 假设您确实有两个日期对象,则可以从另一个对象中减去一个,然后查询结果对象的天数: 它也适用于日期时间-我认为它会四舍五入到最近的日期:

  • 我可以使用MomentJs获得两个日期之间的差异,如下所示: 但是,我还想在适用的情况下显示小时(仅当>=60分钟过去时)。 但是,当我尝试使用以下命令检索持续时间小时数时: 它返回的是当前小时,而不是两个日期之间的小时数。 我如何得到两个时刻之间的小时差?

  • 问题内容: 我知道我可以使用momentjs做任何事情,还可以做一些涉及日期的事情。但是令人尴尬的是,我很难去做一件看起来很简单的事情:得到两次之间的差。 例: 我试过的 我不知道那里的“ 10”是什么。我住在巴西,所以如果相关的话,我们是utc-0300。 结果是持续时间正确的内部值: 所以,我想我的问题是:如何将momentjs持续时间转换为时间间隔?我肯定可以用 但我觉得有一些更 优雅 ,我