与 SQL 的时区协调

2023-12-21

问题1/3:

我有多个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. I'm assuming这会自动更改为CST当在外面时DST, right?

有了以上的知识,我的DSN后缀看起来像这样:

...?parseTime=true&loc=America%2FChicago // i.e. 'America/Chicago' - maybe 'CST6CDT' would work too?

那么,有没有一种编程方式go从 3 字母代码映射CDT更正式的时区名称,例如America/Chicago.

2/3:

上面提出了先有鸡还是先有蛋的场景:为了确定远程服务器的时区,需要连接/查询服务器;有了这些知识,DSN 参数可能会因将来的调用而更改。

事后是否可以更改 DSN 参数,或者进行全新的连接sql.DB需要创建连接池吗?

3/3:

您可能会问,为什么要检查时区是否已更改 - 它不是静态的吗?在负载平衡数据库的情况下应该做什么?理论上两个副本可以位于不同的时区吗?

是否所有带时间戳的列都用 SQL 封装UNIX_TIMESTAMP()标准化数据并避免这个令人头疼的问题?

我也可能会陷入时间漂移,但我现在就到此为止。


1/3

go使用 IANA 的时区数据库 https://www.iana.org/time-zones具有精确的区域名称。 尝试对 MySQL 如何从 (Linux) 主机确定本地时区格式进行逆向工程,并在go正如@MattJohnson 指出的那样,客户被证明是不可靠的。

2/3

database/sql.DB- 创建通过Open(drv, DSN)- 将使用相同的DSN对于所有连接。虽然sql.DB意味着被创建一次并使用多次 - 没有办法改变DSN事后 - 所以人们需要创建一个全新的sql.DB当改变DSN.

3/3

所以更好的策略似乎是利用杠杆MySQL转换所有datetime在传输到客户端之前从本地时区到 UTC 时区的值。这消除了在连接时通过以下方式设置数据库(可能未知)时区的复杂性:DSN.

一种有前途的选择是设置连接的会话时区:

  • SET @@session.time_zone = "+00:00";
  • 然而,这只适用于current连接(在连接池内)。 Ago然而,客户端在任何给定时间都不知道他们可能使用哪个空闲连接。
  • 因此,为了确保这始终有效,需要在之前手动应用它所有查询。即使仅使用一个数据库连接 - 如果连接失败并且连接重试开始 - 任何先前的会话状态都将丢失。

所以相反,包装所有datatime具有如下转换函数的列:

CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')

确保时区计算在查询时完成,并且在连接重新连接等过程中不会丢失。

所以现在DSN不再需要指定loc - as UTC是默认值。事实上DSN只需要后缀选项?parseTime=true允许datetime被翻译成go是本地人time.Time.

最后也是最重要的是,这适用于设置为任何时区的任何服务器。

H/T 对此answer https://stackoverflow.com/a/19069310/1218512.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 SQL 的时区协调 的相关文章

  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我
  • 如何在 Laravel 5 中使用 Orchestral/Tenanti 构建具有多个数据库的多租户应用程序?

    我正在尝试使用 Laravel 5 构建和应用程序 它应该是使用多个数据库的多租户数据库架构 我的雇主出于安全目的要求这样做 我尝试手动管理主数据库迁移和租户迁移 但失败了 所以我决定借助 Laravel 特定包的帮助 这应该是我所需要的
  • MySQL SELECT OpenCarts 数据库中的重复行

    只是玩一下 OpenCart DB 看看我是否能学到一些东西 如果我使用以下SELECT结果返回重复的行 SELECT DISTINCT p product id AS pid p model AS modelo SUBSTRING p m
  • 用教义 2 DBAL 连接子查询

    我正在重构 Zend 框架2应用程序使用学说 2 5 DBAL 而不是 Zend DB ZF1 我有以下 Zend Db 查询 subSelect db gt select gt from user survey status entrie
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • 使用 Sequelize (NodeJS) 代替 * 指定特定字段

    好吧 我在 NodeJS 中有一个项目 我正在其中使用 Sequelize 来实现 MySQL ORM 这件事工作得非常好 但是我试图弄清楚是否有一种方法可以指定在查询的基础上返回哪些字段 或者是否有一种方法可以在某处执行 query 例如
  • 在 Golang 中运行外部 python,捕获连续的 exec.Command Stdout

    所以我的 go 脚本将像这样调用外部 python cmd exec Command python game py cmd Stdout os Stdout cmd Stderr os Stderr go func err cmd Run
  • 在 Python 中,如果我有 unix 时间戳,如何将其插入 MySQL 日期时间字段?

    我正在使用 Python MySQLDB 我想将其插入 Mysql 中的 DATETIME 字段 我该如何使用cursor execute 来做到这一点 要将 UNIX 时间戳转换为 Python 日期时间对象 请使用datetime fr
  • golang.org 包和标准库之间的区别

    我使用 go 已经有一段时间了 我注意到 Go 标准库 和 golang org x 之间存在重复的包 我的问题是 为什么它们被释放两次 在这两者中 我应该使用哪一个 更新的 规范的等 到目前为止我注意到的一些示例包已发布两次 golang
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • 单值上下文中的多值错误

    我在编译 GO 代码时遇到此错误 multiple value fmt Println in single value context 我正在尝试创建一个函数 该函数接受可变数量的整数并将每个变量打印在一行上 GO package main
  • 无法加载身份验证插件“caching_sha2_password”

    我正在将 MySQL 8 0 与 MySQL Workbench 连接并收到以下错误 无法加载身份验证插件 caching sha2 password dlopen usr local mysql lib plugin caching sh
  • Azure 网站服务器时区数据错误

    我来自俄罗斯 1 5 天前 10 月 26 日凌晨 2 点 我们的时区 好吧 我们时区的偏移量 发生了变化 从 UTC 4 变为 UTC 3 请不要问为什么现在 政府已经退出了 但它改变了 我家的Win 8 1机器自动更新 但我的 Azur
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • parent_id 是外键(自引用)并且为 null?

    浏览 Bill Karwin 的书 SQL Antipatterns 第 3 章 Naive Trees 邻接表 父子关系 有一个注释表的示例 CREATE TABLE Comments comment id SERIAL PRIMARY
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐

  • Oracle空条件检查''条件

    我如何比较VARCHAR2变量 哪个是空值 Oracle 不区分空字符串和 NULL 要检查变量是否为空字符串 请使用IS NULL syntax
  • 使用 Docker-Compose 时,使用 JPDA 进行远程调试不会通过 eclipse 连接到 Tomcat

    我对 Docker 很陌生 所以这可能是我做错的一些简单的事情 有了所有的解决方案 当使用 Docker run 启动 Tomcat 容器时 我已经能够使用 eclipse 进行远程调试 docker run it rm e JPDA AD
  • Grails 项目 - Eclipse 中的常见 Java 项目依赖项

    All 我们有标准的 java 项目 其中包含通用数据模型 通用 util 类等 我似乎不明白如何使我的 Grails 项目 在 Eclipse 中 依赖于工作区中的其他标准 非 Grails java 项目 当我在 Java 构建路径 中
  • 如果您不解决或拒绝承诺会怎样?

    我有一个场景 我要返回一个承诺 Promise 基本上是由 ajax 请求触发的 拒绝承诺时 它会显示一个错误对话框 表明服务器存在错误 我想要做的是 当响应代码为 401 时 我既不想解析承诺 也不想拒绝它 因为它已经显示错误对话框 我只
  • 如何使用javascript创建上传进度条

    我使用 php 将文件上传到服务器 在客户端使用 HTML 和 javascript 我想创建一个确定的进度条 显示文件上传的进度 使用javascript 看待 新鲜的 许多图书馆之一 http github com drogus jqu
  • 按代号完全引用工作表

    当我使用 CodeName 属性引用 Excel 工作表时 如何完全限定它们 包括工作簿引用 我想防止出现打开两个不同工作簿且两张工作表具有相同 CodeName 的情况 我用ThisWorkbook因为我想引用运行代码的工作簿 我想象这样
  • Goroutine 是否与其通道一起被垃圾收集?

    想象一下下面的代码 func waitForOneOfTwoProcesses c make chan bool go func time Sleep 1 time Second c lt true go func time Sleep 2
  • 始终在 ASP.NET MVC 控制器中使用异步

    我最近继承了一个ASP NET MVC项目 在该项目中 开发人员正在使用async 到处 我正在尝试评估这是否是一个好主意 具体来说 我现在正在审查控制器代码 在控制器中 开发人员编写了如下内容 public async Task
  • 如何使用 C# 解码 JSON 字符串?

    我正在寻找示例代码 lib 来使用 C 解码 JSON 字符串 要编码我可以这样做 var data new Dictionary
  • 解析 PHP 中的类、函数和参数

    我想创建一个函数 它接收一个参数 该参数保存 PHP 文件的路径 然后解析给定的文件并返回如下所示的内容 class NameOfTheClass function Method1 arg1 arg2 arg2 private functi
  • sin 和 cos 是如何在硬件上实现的?

    我一直在研究如何计算正弦和余弦 我发现了一些 标准 方法 包括查找表 CORDIC 算法和泰勒级数 我还发现大多数现代处理器都有计算三角函数的汇编指令 我想知道的是这些命令是如何工作的 所以 我的问题是 当前一代处理器使用什么特定算法来计算
  • 有没有办法使用内置的苹果 API 在 mkmapview 中获取方向?

    我知道谷歌地图被认为是最好的地图 但我不想下载一堆额外的库之类的 我更喜欢做一些快速简单的事情来获得从 A 点到 B 点的快速路线并完成它 有没有办法使用内置函数 库来做到这一点 有人能指出我正确的方向吗 EDIT 我并不是想逐个轮流指示或
  • 如何从 Java 字符串中删除空字符 (\0)

    我知道 C 中的这段代码试图删除nul人物 0 来自字符串 string Join mText Split new string 0 StringSplitOptions None 有什么方法可以在 Java 中有效地做到这一点吗 你可以写
  • 对于大 n,java.lang.Math.pow(x, n) 的准确/精确度如何?

    我想计算一下 1 0 p n其中 p 是 0 到 1 之间的双精度值 通常非常接近 0 n 是一个正整数 可能约为数百或数千 可能更大 我还不确定 如果可能的话我想只使用Java的内置java lang Math pow 1 0 p n 为
  • PhantomjsDriver 无法在 Windows 和 Linux 上运行

    我有一个使用 Selenium Webdriver 从站点获取一些信息的应用程序 它在 FirefoxDriver 和 ChromeDriver 上工作得很好 但是当我尝试切换到 PhantomJSDriver 时 我遇到了一些困难 在 W
  • 猫鼬承诺与蓝鸟和打字稿

    我正在使用 nodejs typescript 和 mongodb 数据库开发一个应用程序 为了查询数据库 我正在使用mongoose http mongoosejs com index html 我刚刚读过 mongoose 文档中的一篇
  • 如何在 Swift 中子类化自定义 UIViewController?

    我想创建一个可重用的视图控制器UsersViewControllerBase UsersViewControllerBase延伸UIViewController 并实现两个代表 UITableViewDelegate UITableView
  • 如何知道 spring 生成的 bean 中的 bug 行?

    我有一个使用 Spring 和 jpa 由 hibernate 构建的网站 我遇到了错误 但我不知道如何识别错误出现的行 我无法在我的IDE上调试它 因为它是实时版本 在本地一切运行良好 我有日志说 哦 rg springframework
  • Bash:导出未将变量正确传递给父级

    子脚本中导出的变量在父脚本中未定义 a sh bin bash This is the parent script a sh export var 5e 9 b sh var export result res res is defined
  • 与 SQL 的时区协调

    问题1 3 我有多个MySQL要连接的数据库并希望确保查询之间的时间一致性 例如 其中一台服务器当前位于CDT时区 gt select CURRENT TIMESTAMP system time zone global time zone