Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何根据本地服务器时间获取每个状态的基于时间的数据?_Mysql_Sql_Timezone - Fatal编程技术网

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个州跨越时区,加拿大有几个省份也跨越时区。