Mysql 如何根据本地服务器时间获取每个状态的基于时间的数据?
我有以下表格和相关列:Mysql 如何根据本地服务器时间获取每个状态的基于时间的数据?,mysql,sql,timezone,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 如何获得每个州每天的总销售额 有没有更好的方法来处理时区数据?我不知道MySQL的语法,但这是否正确 SELECT sale.name
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的语法,但这是否正确
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_偏移量充其量是草率的,因为utc_偏移量在世界许多地区每年更改两次。通常更好的做法是存储时区名称,并使用实际的时区操纵库为您进行日期计算
编辑
我对时区处理的建议是修改您的状态表,如下所示:
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;
然后按如下方式更新查询:
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的语法,但这是正确的吗
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_偏移量充其量是草率的,因为utc_偏移量在世界许多地区每年更改两次。通常更好的做法是存储时区名称,并使用实际的时区操纵库为您进行日期计算
编辑
我对时区处理的建议是修改您的状态表,如下所示:
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;
然后按如下方式更新查询:
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;
您的解决方案不适用于具有多个时区的州 通常,最佳做法是将每个datetime存储为数据库中的UTC。然后使用客户端的时区(通常在web应用程序中随时可用)将其格式化,以便在用户自己的本地时区中显示给用户
这样,您就不会存储状态时间偏移量,而按状态查询的每日销售额将更加直观 您的解决方案不适用于具有多个时区的州 通常,最佳做法是将每个datetime存储为数据库中的UTC。然后使用客户端的时区(通常在web应用程序中随时可用)将其格式化,以便在用户自己的本地时区中显示给用户
这样,您就不会存储状态时间偏移量,而按状态查询的每日销售额将更加直观 我认为mysql中没有内置的时区支持,但我可能错了。我很想听到任何knows@Bohemian:看起来MySQL确实对此有一些支持。请参见.OK,因此
CONVERT_TZ()
加上存储时区名称就可以了。谢谢。@Bohemian:真的。我用一个查询更新了我的答案,这个查询可能会起作用(未经测试,因为我仍然没有在这里运行MySQL)。我认为MySQL中没有内置的时区支持,但我可能错了。我很想听到任何knows@Bohemian:看起来MySQL确实对此有一些支持。请参见.OK,因此CONVERT_TZ()
加上存储时区名称就可以了。谢谢。@Bohemian:真的。我用一个查询更新了我的答案,这个查询可能会做到这一点(未经测试,因为我仍然没有在这里运行MySQL),也可以迁移到一个“site”表来代替“state”表,其中state作为一列。这将允许每个州有任意数量的时区,并且仍然允许按州分组。你知道世界上任何一个州有多个时区的例子吗?我没有听说过,我住在澳大利亚,那里有世界上最大的州:西澳大利亚州,它只有一个时区。我居住的安萨斯州有两个时区。西部大部分时间在美国山地时间,其余时间在中部时间。沿美国边境的几个墨西哥州都有与美国共享时区的地区,而该州的其他地区都在墨西哥时区。亚利桑那州一年中有一半时间有两个时区,因为该州只有一小部分地区使用DST。快速浏览一下美国至少11个州的多个时区。我知道还有其他的例子。我相信美国有13个州跨越时区,加拿大有几个省份也跨越时区。你也可以用“地点”表代替“州”表,州作为一列。这将允许每个州有任意数量的时区,并且仍然允许按州分组。你知道世界上任何一个州有多个时区的例子吗?我没有听说过,我住在澳大利亚,那里有世界上最大的州:西澳大利亚州,它只有一个时区。我居住的安萨斯州有两个时区。西部大部分时间在美国山地时间,其余时间在中部时间。沿美国边境的几个墨西哥州都有与美国共享时区的地区,而该州的其他地区都在墨西哥时区。亚利桑那州一年中有一半时间有两个时区,因为该州只有一小部分地区使用DST。快速浏览一下美国至少11个州的多个时区。我知道还有其他的例子,我相信美国有13个州跨越时区,加拿大有几个省份也跨越时区。