我有以下表格和相关列:
state
id int
name text
utc_offset int (minutes)
sale
id int
state_id int
created datetime
amount decimal(8,2)
放入该created
列的值是本地服务器时间,状态 id = 1。
如何获得每个州每天的总销售额?
有没有更好的方法来处理时区数据?
您的解决方案不适用于具有多个时区的州。
通常,最佳实践是将每个日期时间作为 UTC 存储在数据库中。然后,您使用客户端的时区(通常在 Web 应用程序中很容易获得)对其进行格式化,以便在他们自己的本地时区中显示给用户。
因此,您不会存储州时间偏移量,并且您每天按州查询的销售额将更加直接。
我不知道 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;