【问题标题】:How can I get time-based data for each state based on local server time?如何根据本地服务器时间获取每个状态的基于时间的数据?
【发布时间】:2012-12-16 19:46:24
【问题描述】:

我有以下表格和相关列:

state
    id int
    name text
    utc_offset int (minutes)

sale
    id int
    state_id int
    created datetime
    amount decimal(8,2)

created 列的值是本地服务器时间,状态 id = 1。

如何获得每个州每天的总销售额?

有没有更好的方法来处理时区数据?

【问题讨论】:

    标签: mysql sql timezone


    【解决方案1】:

    您的解决方案不适用于多个时区的州。

    通常,最佳做法是将每个日期时间都以 UTC 格式存储在数据库中。然后,您使用客户端的时区(通常在 Web 应用程序中很容易获得)对其进行格式化,以便在他们自己的本地时区中显示给用户。

    因此,您不会存储州时间偏移量,并且您每天按州查询的销售额会更加直接。

    【讨论】:

    • 也可以迁移到“站点”表来代替“状态”表,状态为一列。这将允许每个州有任意数量的时区,并且仍然允许按州分组。
    • 您知道世界上任何一个州拥有多个时区的例子吗?我没有听说过,我住在澳大利亚,它拥有世界上最大的州:西澳大利亚,它只有一个时区
    • 我住的堪萨斯州有两个时区。西部大部分时间为美国山区时间,其余部分为中部时间。美国边境沿线的几个墨西哥州的地区与美国共享时区,而该州的其他地区则在墨西哥时区。亚利桑那州半年有两个时区,因为该州只有一小部分地区使用 DST。快速浏览here 显示至少有 11 个美国州具有多个时区。我知道还有其他例子
    • 我相信美国有 13 个跨时区的州,加拿大也有几个跨时区的省。
    【解决方案2】:

    我不知道 MySQL 的语法,但这是在正确的轨道上吗?

    SELECT sale.name AS name, 
        adddate(sale.created. interval (state.utc_offset - (select utc_offset from state where id = 1)) minute) AS date, 
        SUM(amount) AS total_amount
    FROM sale
    JOIN state ON sale.state_id = state.id
    GROUP BY name,date;
    

    注意:像这样存储 utc_offset 充其量是草率的,因为 utc_offset 在世界许多地方每年更改两次。存储时区名称并使用实际的时区操作库为您进行日期计算通常是更好的做法。

    编辑

    我对时区处理的建议是如下修改您的状态表:

    state
        id int
        name text
        tz varchar
    

    然后按如下方式更新您的查询:

    SELECT sale.name AS name,
        CAST(CONVERT_TZ(sale.created,'utc',state.tz) AS DATE) AS date,
        SUM(amount) AS total_amount
    FROM sale
    JOIN state ON sale.state_id = state.id
    GROUP BY name,date;
    

    【讨论】:

    • 我认为 mysql 中没有内置的时区支持,但我可能是错的。我很想听听任何知道的人的意见
    • @Bohemian:看起来 MySQL 确实对此提供了一些支持。见this question
    • 好的,所以 CONVERT_TZ() 加上存储时区的 name 就可以了。谢谢。
    • @Bohemian:确实。我用一个可以解决问题的查询更新了我的答案(未经测试,因为我还没有在这里运行 MySQL)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2011-02-11
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多