【问题标题】:SQL to Merge Date fieldsSQL 合并日期字段
【发布时间】:2023-03-04 20:19:01
【问题描述】:

有人可以帮忙吗?我有一个包含日期时间字段和持续时间的表。我需要的是合并一天发生的记录...如下所示,我的第一列显示日期,第二列显示可用小时数,然后是分钟...如您所见,有一个上午和一个下午,我需要的是每天只选择一条记录,然后选择总持续时间,因此它显示 2004 年 7 月 10 日只有一条记录,然后持续时间计数为 7 小时 30分钟。

2004-10-07 09:00:00.000 4   0
2004-10-07 14:00:00.000 3   30
2004-10-08 09:00:00.000 4   0

【问题讨论】:

  • 你用的是什么数据库?

标签: sql date merge group-by


【解决方案1】:

如果您使用的数据库支持SUMGROUP BY 命令,请尝试以下操作:

这适用于 sqlite3:

SELECT date(date), (sum(hours)*60+sum(minutes))/60, sum(minutes)%60
FROM dates
GROUP BY date(date)

这是对cmets中后续问题的回答:

SELECT
date(free.date),
(SUM(hours)*60+SUM(free.minutes))-
(SELECT (SUM(hours)*60+SUM(used.minutes))
    FROM used
    WHERE date(used.date)=date(free.date))
FROM free
WHERE date(free.date) IN (SELECT DISTINCT date(used.date) FROM used)
GROUP BY date(free.date);

【讨论】:

  • 谢谢...我所追求的...我还有一个问题,在另一个也有时间和日期字段的表中,但在时间部分它有例如 10 分钟,我的第一个显示开放时间,然后第二个表允许添加时间,我现在有总持续时间,但如果有意义的话,需要以某种方式将两者联系起来以计算出免费的持续时间?
  • 只要两个表通过 ID 连接起来,就可以了。使用上面的 select 语句并在 FROM dates 之后添加另一个部分,该部分将加入您的第二个表。 GROUP BY 甚至适用于这些连接的表。如果您还有任何问题,请阅读inner join。 :)
  • 谢谢,我加入了表格 ok - 它更像是一个计算什么时间空闲的公式...例如第一个表格有 7 小时的空闲时间...第二个表格有 30 条记录在这 7 个小时内的同一天,每个人说 5 分钟......所以总共 150 分钟......它如何将使用时间相加,然后从我已经拥有的空闲时间中减去......对不起,如果它听起来很愚蠢,我知道在我的脑海里我知道我的意思:)
  • 我花了一分钟,但我想我知道你想要什么。为了测试,我创建了两个表:free 这是您在原始问题中提到的表。 used 的结构相同,但条目更多,时间值更小。使用它,我用您需要修改的 SQL 语句更新了我的答案。为了便于阅读,我没有在输出中包含拆分小时/分钟,结果是“每天剩余的空闲分钟数”。
  • 当然,这是正确的轨道 - 所以在我的第二个表格中有一个名为持续时间的字段,日期是一致的,并且还有一个日期字段......所以我需要将日期分组首先从第一个字段开始,然后对持续时间进行计算,如下所示:1899-12-30 00:05:00.000。从那里我只需要拿第二部分,将总和加上一个不同的日期,然后从空闲时间中减去以获得 utlisied 时间......哇......我想我今天选择了一个艰难的......谢谢为您的帮助 Stefan... 非常感谢
【解决方案2】:

这个想法是您希望将日期时间转换为日期并按此分组。然后你想总结小时和分钟。很容易将它们总结为分钟60*h + m。但是,将其拆分为小时和分钟需要一些算术运算。

这是一种方法:

select cast(dt as date),
       cast(sum(h * 60 + m)/60 as int) as hours,
       sum(h * 60 + m) - 60 * cast(sum(h * 60 + m)/60 as int) as minutes
from t
group by cast(dt as date);

不幸的是,转换为日期的具体操作取决于数据库。此外,“模数”运算的语法可能因数据库而异,因此直接进行计算会更安全。

【讨论】:

  • 不需要复杂的分钟计算,因为大多数 DBMS 支持 MODULO 运算符:sum(h * 60 + m)/60 -> hours 和 sum(h * 60 + m) MOD 60 -> minutes
  • @dnoeth 。 . .或sum(m) % 60。或者,mod(sum(m), 60)。这就是我要求数据库的原因之一。 (对于使用 mod 得到的分钟数,您不需要计算小时数。)
【解决方案3】:

您可以分 3 步完成:

  • 将小时和分钟添加到日期本身
  • 然后计算同一天的两个日期之间的差值(这将为您提供当天的总时间)
  • 然后分别显示日期和小时

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多