【问题标题】:Sum value by hourly for IST data in UTC databaseUTC 数据库中 IST 数据的每小时总和值
【发布时间】:2016-05-09 12:07:19
【问题描述】:

我在 UTC 时区的数据库和在 UTC 时间插入的数据。我想按小时对 IST 时间数据的所有值求和并分组。如下图,

id  data_id value serverTime
1   2       100   2016-05-02 18:30:54
2   2       100   2016-05-02 18:45:54
4   2       200   2016-05-02  19:00:54
5   2       100   2016-05-02 19:15:54
6   2       100   2016-05-02 19:30:54
7   2       100   2016-05-02  19:40:54 

查询

select sum(value) as value, serverTime as date
from Data_table 
where data_id=2 
and serverTime between CONVERT_TZ('2016-05-03 00:00:01','+00:00', '-05:30') 
and CONVERT_TZ('2016-05-03 10:45:24','+00:00', '-05:30') 
group by year(date),month(date),week(date),day(date),hour(date);

上面的查询给出的结果是:

200    
500

但期待输出:

600    
100

因为IST 12 AM = UTC- 05:30 表示18:30 to 19:30,但这里我的查询只计算18:30 to 19:0019:00 to 20:0020:00 to 21:00,这不是准确度值。

我想计算 18:30 to 19:3019:30 to 20:30 的值以获得 IST 时间数据的准确度值。

如何解决?

【问题讨论】:

  • 你倒过来了。 5:30 IST 是 00:00 UTC。
  • @MattJohnson:我认为 5:30 IST 将是 4:30 UTC(欧洲/都柏林)。 :-)
  • @MattJohnson 如果我们按小时计算,那么它应该是 2016 年 5 月 2 日 18:30 到 19:30 的值的总和,因为 18:30 到 19:30 是上午 12:00 到UTC 时间 2016 年 5 月 3 日 12:59。这是我要计算的。
  • @HowardHinnant - 哈哈。我只是假设他们的意思是印度,而不是爱尔兰。 :)

标签: mysql timezone


【解决方案1】:

IST,我假设您指的是印度标准时间,比 UTC提前 5 小时 30 分钟。作为一个固定的偏移量,那将是+05:30,而不是-05:30。您的结果不正确,因为您的符号倒置了。

CONVERT_TZ 函数接受以下任何一种:

  • 'SYSTEM' 代表本地系统时区
  • 标准ISO 8601 format 中的固定偏移量,它具有UTC 的正偏移量,例如'+05:30' 代表印度,'-10:00' 代表夏威夷。
  • 命名时区,使用标准IANA/Olson TZDB identifiers,假设时区表已填充。印度的时间是'Asia/Kolkata',美国东部时间是'America/New_York',等等。使用此选项需要根据the documentation 填充mysql 时区表。

一般来说,命名时区是首选,因为它们可以适应由于夏令时和历史变化而导致的偏移变化。但是,印度自 1942 年以来一直固定在 +05:30,并且在不久的将来不太可能发生变化,因此如果这是您需要的唯一时区,使用固定偏移方法是合理的处理。

另请注意,“IST”与许多 time zone abbreviations 一样,是模棱两可的。它可以表示印度标准时间 (+05:30)、爱尔兰标准时间 (+01:00) 或以色列标准时间 (+02:00)。另请注意,爱尔兰标准时间实际上是 daylight 时区偏移量,尽管其中包含名称“标准”。为避免混淆,请在以后提及 IST 时指定您的特定位置,并且不要期望计算机能够区分它们。

【讨论】:

  • "应该是 +05:30,而不是 -05:30" 怎么样?我的数据库在 UTC 时区,这意味着印度为 +05:30,所有值都存储在 UTC 时间,所以我应该返回 -5:30 以获取日期为 2015-05-03 的 12 AM 值。
  • 这听起来像是你在尝试自己做数学。 CONVERT_TZ 专为您而设计。您指定 from_tzto_tz 时区。 UTC 是+00:00,印度是+05:30。如果你想转换另一个方向,你交换参数,你不要反转符号。
  • 如果您自己算算,印度比 UTC领先。从 IST 到 UTC 减去 5.5 小时。您添加 5.5 小时从 UTC 到 IST。
【解决方案2】:

您还应该按组转换日期

select sum(value) as value , hour(CONVERT_TZ(serverTime, '+00:00', '-05:30')) as hour
from Data_table 
where data_id=2 
and serverTime between CONVERT_TZ('2016-05-03 00:00:01','+00:00', '-05:30') 
and CONVERT_TZ('2016-05-03 10:45:24','+00:00', '-05:30') 
group hour(CONVERT_TZ(serverTime, '+00:00', '-05:30'));

条件之间的测试

select CONVERT_TZ('2016-05-03 00:00:01','+00:00', '-05:30') , 
       CONVERT_TZ('2016-05-03 10:45:24','+00:00', '-05:30')  from dual;

select CONVERT_TZ('2016-05-03 00:00:01','+00:00', '-05:30') ,  
       CONVERT_TZ('2016-06-03 01:00:24','+00:00', '-05:30')  from dual;

【讨论】:

  • 如果您使用日期组,我认为您应该使用相同的时移.. server_time...我已经更新了答案
  • 让我检查一下这个查询并告诉你
  • 我仍然面临准确性问题。我认为 CONVERT_TZ(serverTime, '+00:00', '-05:30') 从表中获取的数据再次变为 -5:30 (2016-05-02 18:30:54)。
  • 如果我们按小时计算,那么它应该是 2016 年 5 月 2 日 18:30 到 19:30 的值的总和,因为 18:30 到 19:30 是上午 12:00 到 12 点: 59 在 2016-05-03 UTC。这是我要计算的。
  • 我已更新答案请在您的问题中提供此查询的结果..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多