Mysql
 sql >> Database >  >> RDS >> Mysql

riconciliazione del fuso orario con SQL

1/3

go utilizza il database del fuso orario di IANA con nomi di zona precisi. Tentando di decodificare il modo in cui MySQL determina il formato del fuso orario locale da un host (Linux) e duplica quella logica in un go client - come ha sottolineato @MattJohnson - si rivela inaffidabile.

2/3

database/sql.DB - creato tramite Open(drv, DSN) - utilizzerà lo stesso DSN per tutti i collegamenti. Mentre un sql.DB è pensato per essere creato una volta e utilizzato molte volte - non c'è modo di cambiare il DSN dopo il fatto, quindi sarebbe necessario creare un nuovo sql.DB quando si modifica il DSN .

3/3

Quindi la strategia migliore sembra sfruttare MySQL per convertire tutti i datetime valori dal fuso orario locale al fuso orario UTC prima della trasmissione al client. Ciò elimina la complicazione dell'impostazione del fuso orario (possibilmente sconosciuto) del database al momento della connessione tramite il DSN .

Un'opzione promettente è impostare il fuso orario della sessione della connessione:

  • SET @@session.time_zone = "+00:00";
  • tuttavia, questo funziona solo per la corrente connessione (all'interno del pool di connessioni). Un go il client tuttavia non saprà quale connessione gratuita potrebbe utilizzare in qualsiasi momento.
  • Quindi, per garantire che funzioni sempre, è necessario applicarlo manualmente prima di tutte le query . Anche se è in uso una sola connessione DB, se la connessione non riesce e si avvia un nuovo tentativo di connessione, qualsiasi stato della sessione precedente andrebbe perso.

Quindi, invece, avvolgere tutto datatime colonne con una funzione di conversione come questa:

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

assicura che il calcolo del fuso orario venga eseguito al momento della query e non vada perso durante una riconnessione della connessione ecc.

Quindi ora il DSN non è più necessario specificare loc - come UTC è l'impostazione predefinita. Infatti il ​​DSN necessita solo dell'opzione suffisso di ?parseTime=true per consentire il datetime da tradurre in go time.Time nativa di .

Infine e soprattutto, funzionerà con qualsiasi server impostato su qualsiasi fuso orario.

H/T a questa answer .