DB2 timestampdiff fonction retournant des résultats inattendus
Je suis en utilisant la syntaxe suivante
TIMESTAMPDIFF(2, CHAR(CREATED - TIMESTAMP('1970-01-01 00:00:00'))
où CREATED
est de type TIMESTAMP
et la base de données DB2. L'intension est d'obtenir le timestamp converti à millis de l'époque. Si il y a une meilleure fonction qui serait plus utile.
Exemple de données:
Pour 2011-10-04 13:54:50
valeur retournée est 1316613290
mais la valeur réelle doit être 1317732890
(obtenu à partir de http://www.epochconverter.com)
Requête à exécuter
SELECT TIMESTAMPDIFF(2, CHAR(TIMESTAMP('2011-10-04 13:54:50') - TIMESTAMP('1970-01-01 00:00:00'))) FROM SYSIBM.SYSDUMMY1;
OriginalL'auteur Manoj | 2011-10-06
Vous devez vous connecter pour publier un commentaire.
C'est le résultat du fait que
TIMESTAMPDIFF
retourne un estimation de la différence entre les horodateurs, pas la réelle valeur, comme prévu.De la référence, page 435 (en supposant que pour iSeries):
Et la formule de calcul utilisée est:
C'est, pour des raisons évidentes, inexact. Pas utile.
Cela semble être une conséquence directe de la façon dont le timestamp de l'arithmétique résultats sont renvoyés.
C'est-à -
retourne:
1
année02
mois01
jours00
heures00
minutes00
secondes000000
microsecondesQui est imprécis période/durée d'informations. Bien qu'il existe une multitude de situations où ce type de données est utile, ce n'est pas l'un d'eux.
Réponse courte: La réponse exacte ne peut pas être correctement calculée dans la base de données, et en fait ne devrait pas.
Réponse longue:
Les calculs sont possible, mais plutôt complexe, et certainement pas adapté pour les dans la base de données de calcul. Je ne vais pas reproduire ici (JodaTime si vous êtes intéressés, plus précisément les différents
Chronology
sous-classes). Votre plus gros problème va être le fait que les mois n'ont pas tous la même longueur. Aussi, vous allez rencontrer de problèmes majeurs si votre horodatages sont autre chose que de l'UTC - plus précisément, à l'heure d'été est en passe de jouer des ravages avec le calcul. Pourquoi? Car les décalages peuvent changer à tout moment, pour n'importe quel pays.Peut-être que vous pourriez nous expliquer pourquoi vous avez besoin le nombre de millisecondes? Nous espérons que vous êtes à l'aide de Java (ou en mesure de le faire), et peut utiliser
java.time
. Mais si vous êtes sur un iSeries, c'est probablement RPG...OriginalL'auteur Clockwork-Muse
Selon le v9.7 info centre, TIMESTAMPDIFF retourne un estimé différence de temps, basé sur 365 jours dans une année (pas vrai ~25% du temps), 30 jours dans un mois (pas vrai 75% du temps, même si la moyenne est un peu mieux que ça), 24 heures dans une journée (pas vrai un couple de jours de l'année dans certains fuseaux horaires), 60 minutes dans une heure (hourra, un droit!), et 60 secondes dans une minute (true >99,9% du temps, nous avons des secondes intercalaires).
Alors, non, ce n'est pas la façon d'obtenir de l'époque dans DB2. Jusqu'à présent, j'ai eu recours à l'obtention de l'époque comme un timestamp, et de le convertir en client.
OriginalL'auteur Tanktalus
Partie de votre erreur se produit en raison de l'inexactitude de la TIMESTAMPDIFF fonction, comme d'autres l'ont souligné.
L'autre source d'erreur se produit parce que l'Époque est basé sur GMT – donc, vous avez à prendre votre fuseau horaire local en compte.
Ainsi, vous pouvez le faire avec l'expression suivante:
Vous pouvez écrire une simple UDF de le simplifier:
Bonne chance,
OriginalL'auteur Ian Bjorhovde