Mysql
 sql >> Base de données >  >> RDS >> Mysql

réconciliation du fuseau horaire avec SQL

1/3

go utilise la base de données de fuseaux horaires de l'IANA avec des noms de zone précis.Essayer d'inverser la manière dont MySQL détermine le format de fuseau horaire local à partir d'un hôte (Linux) et de dupliquer cette logique dans un go les clients - comme l'a souligné @MattJohnson - s'avèrent peu fiables.

2/3

database/sql.DB - créé via Open(drv, DSN) - utilisera le même DSN pour toutes les connexions. Alors qu'un sql.DB est destiné à être créé une fois et utilisé plusieurs fois - il n'y a aucun moyen de changer le DSN après coup - il faudrait donc créer un tout nouveau sql.DB lors du changement de DSN .

3/3

Donc, la meilleure tactique semble tirer parti de MySQL pour convertir tous les datetime valeurs du fuseau horaire local au fuseau horaire UTC avant transmission au client. Cela supprime la complication de la définition du fuseau horaire de la base de données (éventuellement inconnu) au moment de la connexion via le DSN .

Une option prometteuse consiste à définir le fuseau horaire de la session de connexion :

  • SET @@session.time_zone = "+00:00";
  • cependant, cela ne fonctionne que pour le courant connexion (au sein du pool de connexion). Un go le client ne saura cependant pas quelle connexion gratuite il peut utiliser à un moment donné.
  • Ainsi, pour s'assurer que cela fonctionne toujours, il faudrait l'appliquer manuellement avant toutes les requêtes . Même si une seule connexion à la base de données est utilisée - si la connexion échoue et qu'une nouvelle tentative de connexion est lancée - tout état de session précédent sera perdu.

Donc, à la place, envelopper tous les datatime colonnes avec une fonction de conversion comme celle-ci :

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

garantit que le calcul du fuseau horaire est effectué au moment de la requête et ne sera pas perdu lors d'une reconnexion, etc.

Alors maintenant, le DSN n'a plus besoin de spécifier loc - comme UTC est la valeur par défaut. En fait la DSN n'a besoin que de l'option de suffixe ?parseTime=true pour autoriser le datetime à traduire en go time.Time natif de .

Enfin et surtout, cela fonctionnera avec n'importe quel serveur défini sur n'importe quel fuseau horaire.

H/T à cette réponse .