Convertir millisecondes d'Horodatage
Je sais que pour convertir un timestamp Unix (en millisecondes) pour un timestamp SQL je peux utiliser
SELECT TO_DATE('1970-01-01','YYYY-MM-DD HH24:MI:SS') +
(:timestamp / (1000*60*60*24)) FROM DUAL;
Mais j'ai besoin d'un Timestamp, j'ai donc essayé avec
SELECT TO_TIMESTAMP('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SSFF3') +
(:timestamp) from DUAL
Qui me donne l'erreur:
Erreur: ORA-01841: (complète) de l'année doit être comprise entre -4713 et +9999, et de ne pas être 0
Il semble que l'ajout de 1 pour l'horodatage toujours le convertit en un jour.
Comment puis-je faire la même chose pour obtenir un réel timestamp?
Connexes: stackoverflow.com/questions/9483465/...
OriginalL'auteur radlan | 2013-03-20
Vous devez vous connecter pour publier un commentaire.
Vous obtiendrez un
timestamp
si vous ajoutez uninterval
à untimestamp
(voir date/intervalle de l'arithmétique).Comme Benoit remarqué, vous ne pouvez pas spécifier un intervalle de secondes lorsqu'il y a plus de 2.1e9:
C'est pourquoi vous devez utiliser des procès-verbaux de ne pas perdre de précision. Par exemple, en supposant que
:TS
est le timestamp unix (c'est à dire un nombre):utilisation
MINUTE
lorsque vous traitez avec des dates > 2038, voir mon jour 😉OriginalL'auteur Vincent Malgrat
Il existe deux types:
Intervalles est ce que vous obtenez lorsque vous soustrayez les horodatages, et il est absurde d'ajouter les horodatages ensemble.
Si vous avez besoin pour obtenir un millième de seconde d'intervalle, je vous suggère d'utiliser un intervalle d'une seconde et le diviser par 1000:
Que j'ai pu suggérer:
Le problème ici est que vous ne pouvez pas utiliser plus de 9 chiffres dans un même heure littérale.
Si vous avez besoin d'ad 2,061,464,797,255 millisecondes à l'époque, je peux vous proposer:
Vous obtenez 2035-04-29 13:06:37.255000000
Il semble faire l'objet de la 2038 bug: TIMESTAMP'1970-01-01 00:00:00' + 3 milliards de secondes ne fonctionne pas, alors que cela fonctionne avec 2 milliards de dollars.
numtodsinterval
n'a pas une telle limitation?Malgrat: votre approche est la meilleure, ma réponse introduit intervalle de littéraux. Notez que
timestamp'1970-01-01 00:00:00' + numtodsinterval(3000000000,'SECOND')
a aussi la 2038 bug.belle prise! Je ne savais pas à ce sujet!
Grâce à vous, trop. Mais j'aime bien Vincent solution. Le
numtodsinterval
fonction est très utile.OriginalL'auteur Benoit
Utilisation
Juste un min. Il y a une erreur fondamentale lorsque vous ajoutez
:timestamp
dans votre code. Donnez-moi un momentEssayez-le maintenant. J'ai édité ma réponse.
OriginalL'auteur Rachcha