【问题标题】:Average Hour of Day in TeradataTeradata 中的平均一天时间
【发布时间】:2015-07-03 18:28:53
【问题描述】:

我有一个包含数百个时间戳的表。

我提取小时,然后我可以简单地平均,但是,这就是我遇到问题的地方。

select purchase,
CAST(AVG(EXTRACT(HOUR FROM opened_at)) AS INT) as average_open
            from db.purchasetable 
group by 1

当我平均第 22 小时和第 2 小时时,我得到 12(显然),但是,我想要的是 0,因为午夜是两个小时之间的平均时间点。

如何在 Teradata 中执行此操作?

【问题讨论】:

  • 我不确定这是否可能,因为 2 到 22 之间的平均值仍然应该是 12,而不是 0,可能你需要重新考虑你的要求
  • 0 不会是平均点,而是中间点。您是否正在寻找一天中大多数人会活跃的时间?这可能更容易。
  • 如果您希望这一天具有相关性,那么您需要将这一天包括在您的平均计算中。这当然意味着您在月底仍有问题 - 因此您应该包括月份。然后年终...包括年份。所以这真的取决于你在这里想要实现的目标:)
  • 感谢您的意见。我正在寻找的是在 sql 中给我 0 的解决方法
  • 要添加到该评论,我想要一天中的平均时间而不是平均日期

标签: sql datetime timestamp teradata


【解决方案1】:

你不能对 time 进行平均,但对于 interval 是允许的 :-)

两次相减返回一个区间:

AVG(CAST(opened_at AS TIME(0))            -- extract only the time portion
     - TIME '12:00:00' HOUR TO SECOND(0)) -- subtract 12 hours to center at midnight (returns an interval)
+ TIME '00:00:00'                         -- change it back to a time

如果你仍然想要一个小时作为结果,你可以简单地提取它。

【讨论】:

    【解决方案2】:

    检查您的场所。将小时视为不同长度的字符串都从同一个地方(午夜)开始。所以两个字符串的平均长度,一个长度为 22,另一个长度为 2。

    也就是说,凌晨 2 点到晚上 10 点之间的平均值是中午,而不是午夜(长度 = 0)。这些时间发生在不同日期的事实是偶然的。

    所以你一直都有正确的答案。

    【讨论】:

    • 我很欣赏 12 在数学上是正确的答案,但是我正在寻找一种解决方法来给我午夜。
    • 您的问题涉及 AVERAGE。午夜不是您提供的两次的平均值,而是它们之间的中间时间。您可以编写一个函数来返回两个周期之间的中间周期,但从您的问题中可以看出您正在查看的不仅仅是两个日期。你能用简单的英语准确地说明你在寻找什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多