如何根据本地服务器时间为每个状态获取基于时间的数据?

时间:2013-01-02 12:32:53

标签: mysql sql timezone

我有以下表格和相关栏目:

state
    id int
    name text
    utc_offset int (minutes)

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

放入created列的值是本地服务器时间,其状态为id = 1.

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

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

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

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