2

我有以下表格和相关列:

state
    id int
    name text
    utc_offset int (minutes)

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

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

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

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

4

2 回答 2

2

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

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

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

于 2013-01-02T12:59:30.460 回答
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;
于 2013-01-02T12:37:47.137 回答