【问题标题】:How to sort an event table by time (have different timezones)?如何按时间对事件表进行排序(有不同的时区)?
【发布时间】:2011-03-16 04:46:46
【问题描述】:

我有一个按以下方式构造的表格(我无法更改):

事件名称、本地时间、时区

数据会是这样的:

Event1, 10:00, ET
Event2, 11:00, ET
Event3, 12:00, ET
Event4, 10:00, CT

我如何编写一个 sql 来按实际时间排序,所以结果如下:

Event1, 10:00, ET
Event2, 11:00, ET
Event4, 10:00, CT
Event3, 12:00, ET

请注意,Event2 和 Event4 是同时发生的,所以先发生的无关紧要。

我的数据库是 MySQL。

同样,我无法修改源代码,所以我必须处理我正在处理的数据

谢谢

【问题讨论】:

    标签: mysql database time sorting timezone


    【解决方案1】:

    使用现代版本的 mysql...

    Create table Tz_offsets:
    col Timezone, offset
    Data:
    ET, 0
    CT, 1
    
    
    Select EventName, LocalTime, Timezone
    From my_data_table 
    JOIN Tz_offsets On Tz_offsets.Timeszone = my_data_table.Timeszone 
    Where xxx
    Order By (LocalTime - offset)
    

    这里的关键是Order By可以带一个表达式。

    http://dev.mysql.com/doc/refman/5.5/en/select.html

    优化

    在上面的例子中,MySql 将创建一个临时表。根据您的数据大小,支付数据插入费用与支付数据检索费用可能快得多

    为此:向数据表中添加另一列“time_gmt”,然后对新列进行排序。但如果你不能,上述方法将起作用。

    如果不能添加Tz_offsets表(如果只能使用raw sql),那么你有两种选择:

    1. 每次运行 sql 时都将 Tz_offsets 表添加为临时表。您的 MySQL 用户将需要临时表创建权限。

    2. 使用 Case 表达式在 order by 表达式中执行 tz 偏移查找。

    例如

    Select EventName, LocalTime, Timezone
    From my_data_table 
    Where xxx
    Order By (LocalTime - 
      (CASE Timezone WHEN 'ET' THEN 0 WHEN 'CT' THEN 1 WHEN 'PT' THEN 3 ELSE 0))
    

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2010-11-28
      • 2021-12-26
      • 1970-01-01
      • 2017-09-09
      • 2020-05-21
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多