sql >> Databasteknik >  >> RDS >> Mysql

tidszonsavstämning med SQL

1/3

go använder IANA:s tidszondatabas med exakta zonnamn. Försöker omvända konstruera hur MySQL bestämmer det lokala tidszonsformatet från en (Linux) värd och duplicera den logiken i en go klienter - som @MattJohnson påpekade - visar sig vara opålitliga.

2/3

database/sql.DB - skapad via Open(drv, DSN) - kommer att använda samma DSN för alla anslutningar. Medan en sql.DB är tänkt att skapas en gång och användas många gånger - det finns inget sätt att ändra DSN i efterhand - så man skulle behöva skapa en helt ny sql.DB när du ändrar DSN .

3/3

Så ju bättre tack, verkar dra nytta av MySQL för att konvertera alla datetime värden från lokal till UTC-tidszon innan överföring till klienten. Detta tar bort komplikationen med att ställa in databasens (möjligen okänd) tidszon vid anslutningstid via DSN .

Ett lovande alternativ är att ställa in anslutningens sessionstidszon:

  • SET @@session.time_zone = "+00:00";
  • dock fungerar detta bara för aktuella anslutning (inom anslutningspoolen). En go klienten kommer dock inte att veta vilken gratis anslutning de kan använda när som helst.
  • Så för att säkerställa att detta alltid fungerar måste man tillämpa det manuellt före alla frågor . Även om bara en DB-anslutning används - om anslutningen misslyckas och anslutningsförsöket startar igen - skulle alla tidigare sessionstillstånd gå förlorade.

Så istället, packa all datatime kolumner med en konverteringsfunktion så här:

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

säkerställer att tidszonsberäkningen görs vid förfrågningstillfället och inte kommer att gå förlorad under en återkoppling av anslutningen etc.

Så nu DSN behöver inte längre ange loc - som UTC är standard. Faktum är att DSN behöver bara suffixalternativet ?parseTime=true för att tillåta datetime ska översättas till go s ursprungliga time.Time .

Slutligen och viktigast av allt, detta kommer att fungera med vilken server som helst som är inställd på vilken tidszon som helst.

H/T till detta svar .




  1. För många öppna filer fel på Ubuntu 8.04

  2. Utforska alternativ för lågprioriterade lås väntan i SQL Server 2014 CTP1

  3. php MySql-anslutningsfel

  4. Komplett guide för att åtgärda SQL Database Error 5243