我有以下表格和相关栏目:
state
id int
name text
utc_offset int (minutes)
sale
id int
state_id int
created datetime
amount decimal(8,2)
放入created
列的值是本地服务器时间,其状态为id = 1.
如何获得每个州每天的总销售额?
有没有更好的方法来处理时区数据?
答案 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应用程序中随时可用)对其进行格式化,以便在用户自己的本地时区显示给用户。
因此,您不会存储状态时间偏移,并且状态查询每天的销售量会更加直接。