web-dev-qa-db-fra.com

MySQL peut-il convertir une heure UTC stockée en fuseau horaire local?

MySQL peut-il convertir une heure UTC stockée en heure de fuseau horaire local directement dans une instruction de sélection normale?

Disons que vous avez des données avec un horodatage (UTC).

CREATE TABLE `SomeDateTable` (
  `id`    int(11) NOT NULL auto_increment,
  `value` float NOT NULL default '0',
  `date`  datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)

Puis quand je

"select value, date from SomeDateTable";

Je reçois bien sûr toutes les dates comme dans leur formulaire UTC stocké.

Mais disons que je voudrais les avoir dans un autre fuseau horaire (avec DST), puis-je ajouter de la magie à la requête de sélection afin que je récupère toutes les dates dans le fuseau horaire sélectionné?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";

Ou dois-je le faire dans une autre couche sur le dessus, comme dans un code php? (il semble que la plupart des gens aient résolu ce problème).

Merci Johan


Si votre installation MySQL vous permet d'utiliser CONVERT_TZ c'est une solution très propre, cet exemple montre comment l'utiliser.

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )

Cependant, je ne sais pas si c'est un bon moyen car certaines fonctions MySQL manquent cette fonction, utilisez-la avec précaution.

47
Johan
32
Stephen Fischer

Pour ceux qui ne peuvent pas configurer l'environnement mysql (par exemple en raison d'un manque d'accès SUPER) pour utiliser des noms de fuseau horaire conviviaux comme "America/Denver" ou "GMT", vous pouvez également utiliser la fonction avec des décalages numériques comme celui-ci:

CONVERT_TZ(date,'+00:00','-07:00')
25
tmsimont
select convert_tz(now(),@@session.time_zone,'+03:00')

Pour obtenir l'heure uniquement, utilisez:

time(convert_tz(now(),@@session.time_zone,'+03:00'))
9
Jestin

Je propose d'utiliser

SET time_zone = 'proper timezone';

en cours une fois juste après la connexion à la base de données. et après cela, tous les horodatages seront convertis automatiquement lors de leur sélection.

2
zerkms

Je ne sais pas quel calcul peut être fait sur un type de données DATETIME, mais si vous utilisez PHP, je recommande fortement d'utiliser les horodatages basés sur des nombres entiers. Fondamentalement, vous pouvez stocker un entier de 4 octets dans la base de données en utilisant la fonction time () de PHP. Cela rend le calcul beaucoup plus simple.

0
TheBuzzSaw

On peut facilement utiliser

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')

Par exemple:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')

Plus cela peut également être utilisé dans l'instruction WHERE et pour comparer l'horodatage, j'utiliserais ce qui suit dans la clause Where:

WHERE CONVERT_TZ(timeperiod, 'UTC', '{$this->timezone}') NOT BETWEEN {$timeperiods['today_start']} AND {$timeperiods['today_end']}
0
MR_AMDEV