sql >> Base de Datos >  >> RDS >> Mysql

reconciliación de zona horaria con SQL

1/3

go utiliza la base de datos de zonas horarias de IANA con nombres de zona precisos. Intentar aplicar ingeniería inversa a cómo MySQL determina el formato de la zona horaria local de un host (Linux) y duplicar esa lógica en un go clientes, como señaló @MattJohnson, demuestra ser poco confiable.

2/3

database/sql.DB - creado a través de Open(drv, DSN) - utilizará el mismo DSN para todas las conexiones. Mientras que un sql.DB está destinado a ser creado una vez y utilizado muchas veces; no hay forma de cambiar el DSN después del hecho, por lo que sería necesario crear un nuevo sql.DB al cambiar el DSN .

3/3

Entonces, la mejor táctica parece aprovechar MySQL para convertir todo datetime valores de zona horaria local a UTC antes de la transmisión al cliente. Esto elimina la complicación de configurar la zona horaria de la base de datos (posiblemente desconocida) en el momento de la conexión a través del DSN .

Una opción prometedora es establecer la zona horaria de la sesión de conexión:

  • SET @@session.time_zone = "+00:00";
  • sin embargo, esto solo funciona para el actual conexión (dentro del conjunto de conexiones). Un go sin embargo, el cliente no sabrá qué conexión gratuita puede estar usando en un momento dado.
  • Entonces, para asegurarse de que esto siempre funcione, sería necesario aplicarlo manualmente antes de todas las consultas . Incluso si solo se está utilizando una conexión de base de datos, si la conexión falla y se vuelve a intentar la conexión, se perdería cualquier estado de sesión anterior.

Entonces, en cambio, envolver todo datatime columnas con una función de conversión como esta:

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

asegura que el cálculo de la zona horaria se realiza en el momento de la consulta y no se perderá durante una reconexión de conexión, etc.

Así que ahora el DSN ya no necesita especificar loc - como UTC es el predeterminado. De hecho, el DSN solo necesita la opción de sufijo de ?parseTime=true para permitir el datetime para ser traducido a go time.Time nativo de .

Finalmente y lo más importante, esto funcionará con cualquier servidor configurado en cualquier zona horaria.

H/T a esta respuesta .