2009-09-21 5 views
2

J'ai une erreur de fuseau horaire que je dois corriger dans un tableau. Toutes les dates et heures avant l'horodatage d'unix 1253568477 doivent avoir 5 heures ajoutées à leurs valeurs pour les rendre égales à GMT.Corriger les colonnes Date et Heure dans MySQL

je les colonnes suivantes ...

date (type de données date), hors de -5 heures

time (type de données time), hors de -5 heures

timestamp (type de données int), cette colonne est l'heure exacte

La raison pour laquelle les fuseaux horaires sont désactivés est due à la façon dont je réglais la valeur s lors de l'insertion des lignes ...

$sql = "insert into email_opens (userid, email, serial, date, time, timestamp) values (
'$userid', 
'$opened_by', 
'$serial_number', 
now(), 
now()', 
'".gmmktime()."' 
)"; 

La valeur now() utilisait le fuseau horaire du serveur (est) alors que la valeur spécifiée gmmktime GMT. J'ai depuis corrigé cette requête pour toujours utiliser GMT.

Est-il possible d'ajouter 5 heures aux colonnes time et date pour les lignes où l'horodatage < 1253568477 dans une requête batch?

Précision:

Mon but est de mettre à jour chaque ligne incorrecte dans la table avec le temps correct en ajoutant 5 heures à chaque valeur.

+0

J'ai mis à jour ma réponse! – inakiabt

Répondre

1

Essayez avec ceci:

UPDATE mail_opens SET date = DATE_ADD(CONCAT(date, ' ', time), INTERVAL 5 HOUR), time = DATE_ADD(CONCAT(date, ' ', time), INTERVAL 5 HOUR); 

Et alors vous avez probablement ceci:

<?php 
    echo date('Y-m-d H:i:s')."<br>"; 
    $addhours = strtotime('+5 hour'); 
    echo $addhours."<br>"; 
    $newdate = date('Y-m-d H:i:s', $addhours); 
    echo $newdate; 
?> 

Ainsi, en utilisant que:

<?php 
$addhours = strtotime('+5 hour'); 
$newdate = date('Y-m-d H:i:s', $addhours); 
$sql = "insert into email_opens (userid, email, serial, date, time, timestamp) values (
'$userid', 
'$opened_by', 
'$serial_number', 
'$newdate', 
'$newdate', 
'".gmmktime()."' 
)"; 
?> 
+0

Puisque je veux mettre à jour des lignes existantes, je pourrais transformer cela en une instruction UPDATE en boucle. Mais y a-t-il une déclaration MySQL qui pourrait le faire sans avoir besoin de PHP? – Ian

+0

bien! était déconner avec la fonction date_add, mais il manquait votre partie concat! bonne réflexion :) – Ian

0

sûr, travailler le temps que vous corrigiez le problème que vous connaissez seulement pour mettre à jour les enregistrements qui ont une valeur inférieure à l'horodatage unix de votre changement de fuseau horaire.

Ensuite, mettez à jour le champ et ajoutez 60 * 60 * 5 (5 heures en secondes) à ces enregistrements.

Ainsi, votre requête serait la suivante:

UPDATE email_opens SET timestamp = (timestamp + 18000) WHERE timestamp < 1253568477; 

cool.

+0

C'est presque ça! ..mais vous ajoutez 120 heures à la valeur d'horodatage déjà correcte, quand j'ai besoin d'ajouter 5 * heures * aux valeurs de date et d'heure. – Ian

+0

Vous avez raison, je pensais 5 jours au lieu de 5 heures! woops:/ – Evernoob

+0

merci pour votre réponse si :) – Ian