我有许多 MySQL 数据库要连接并希望确保跨查询的时间一致性。因此,例如,其中一台服务器当前处于 CDT 时区。
> select CURRENT_TIMESTAMP, @@system_time_zone, @@global.time_zone, @@session.time_zone;
+---------------------+--------------------+--------------------+---------------------+
| CURRENT_TIMESTAMP | @@system_time_zone | @@global.time_zone | @@session.time_zone |
+---------------------+--------------------+--------------------+---------------------+
| 2019-05-31 09:44:45 | CDT | SYSTEM | SYSTEM |
+---------------------+--------------------+--------------------+---------------------+
注意:我们现在处于 DST,因此是 CDT。我假设这会在 DST 之外时自动更改为 CST,对吗?
根据以上知识,我的 DSN 后缀看起来像这样:
...?parseTime=true&loc=America%2FChicago // i.e. 'America/Chicago' - maybe 'CST6CDT' would work too?
那么,go 中是否有一种编程方式可以将 3 字母代码 CDT 映射到更正式的时区名称,如 America/Chicago.
上面是先有鸡还是先有蛋的场景:为了确定远程服务器的时区,需要连接/查询服务器;有了这些知识,DSN 参数可能会因将来的调用而改变。
事后是否可以更改 DSN 参数,或者是否需要创建一个全新的连接 sql.DB 连接池?
您可能会问,为什么要检查时区是否已更改 - 它不是静态的吗?在负载平衡的数据库情况下应该做什么?理论上,两个副本可以位于不同的时区吗?
所有带有时间戳的列是否都应该用 SQL UNIX_TIMESTAMP() 包装起来以规范化数据并避免这种令人头疼的问题?
我也可以进入时间漂移,但我现在就到此为止。
最佳答案
go 使用 IANA 的 Time Zone Database具有精确的区域名称。
试图逆向工程 MySQL 如何从 (Linux) 主机确定本地时区格式并在 go 客户端中复制该逻辑 - 正如@MattJohnson 指出的那样 - 被证明是不可靠的。
database/sql.DB - 通过 Open(drv, DSN) 创建 - 将对所有连接使用相同的 DSN。虽然 sql.DB 旨在创建一次并多次使用 - 但事后无法更改 DSN - 因此需要创建一个品牌更改 DSN 时新建 sql.DB。
因此,更好的策略似乎是利用 MySQL 将所有 datetime 值在传输到客户端之前从本地时区转换为 UTC 时区。这消除了在连接时通过 DSN 设置数据库(可能未知)时区的复杂性。
一个有前途的选择是设置连接的 session 时区:
SET @@session.time_zone = "+00:00";go 客户端在任何给定时间都不知道他们可能正在使用哪个空闲连接。因此,将所有 datatime 列包装成一个转换函数,如下所示:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
确保时区计算在查询时完成,并且不会在连接重新连接等期间丢失。
所以现在 DSN 不再需要指定 loc - 因为 UTC 是默认值。事实上 DSN 只需要 ?parseTime=true 的后缀选项就可以让 datetime 被翻译成 go 的原生 time.Time。
最后也是最重要的一点,这将适用于设置为任何时区的任何服务器。
H/T answer .
关于mysql - 与 SQL 的时区协调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397882/
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
在我的场景中,Logstash收到的系统日志行的“时间戳”是UTC,我们在Elasticsearch输出中使用事件“时间戳”:output{elasticsearch{embedded=>falsehost=>localhostport=>9200protocol=>httpcluster=>'elasticsearch'index=>"syslog-%{+YYYY.MM.dd}"}}我的问题是,在UTC午夜,Logstash在外时区(GMT-4=>America/Montreal)结束前将日志发送到不同的索引,并且索引在20小时(晚上8点)之后没有日志,因为“时间戳”是UTC。我们已
Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject
我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案