:salut:
Je récupère sur Oracle des données provenant d'une base SQL Server. Dans ces données ce trouve un Timestamp mais moi il me faut un DateTime.
Comment peut-on utiliser un Timestamp SQL Server en Oracle ?
:merci:
Version imprimable
:salut:
Je récupère sur Oracle des données provenant d'une base SQL Server. Dans ces données ce trouve un Timestamp mais moi il me faut un DateTime.
Comment peut-on utiliser un Timestamp SQL Server en Oracle ?
:merci:
Connais pas ce que c'est le Timestamp dans SQL Server. Un exemple ?
Et puis comment ces données sont récupérées: via un fichier, via un lien direct à la base SQLServer, autre ?
Les données sont récupérées depuis une requête genre
et le timestamp est comme ceciCode:
1
2
3
4
5
6
7 SELECT "time", "gateId" FROM dbo.table_name@maestro a WHERE a."gateId" IN (SELECT a."gateId" FROM dbo.table_name@maestro a WHERE a."name" LIKE '%RCO%' AND a."description" IN ('S1', 'DS'));
Code:1199602800000
J'ai testé de cette manière mais ça ne fonctionne pas du tout
Code:SELECT (TO_DATE ('01-JAN-1900') + 1199606400000) - 2 FROM DUAL;
Citation:
ORA-01858: Caractère non numérique trouvé à la place d'un caractère numérique
Après pas mal de tests, ceci fonctionne:
Code:
1
2
3
4
5
6
7
8 SELECT ( TIMESTAMP '1970-01-01 00:00:00 GMT' + NUMTODSINTERVAL ( SUBSTR (TO_CHAR (1199602800000), 1, LENGTH (TO_CHAR (1199602800000)) - 3), 'SECOND')) AS dte FROM DUAL;
J'ai trouvé ici cette information mais il faut encore creuser je pense.
Citation:
Date and time are stored as two 4-byte integers. The date portion is represented as a count of the number of days offset from a baseline date (1/1/1900) and is stored in the first integer. Permitted values are legal dates between 1st January, 1753 AD and 31st December, 9999 AD. Permitted values in the time portion are legal times in the range 0 to 25920000. Accuracy is to the nearest 3.33 milliseconds with rounding downward. Columns of type DATETIME have a default value of 1/1/1900.
En vrai ce n'est pas un datatype TIMESTAMP SQL-Server, c'est une définition fonctionnelle qui ressemble accessoirement à un timestamp unix.
Par contre je suis toujours épaté par ces formules :
J'ai rajouté le to_number car il est implicitement fait par le SGBD car la fonction NUMTODSINTERVAL prend un nombre en premier argument.Code:TO_NUMBER(SUBSTR (TO_CHAR (1199602800000), 1, LENGTH (TO_CHAR (1199602800000)) - 3))
Alors qu'une simple division arrondie :
Code:TRUNC(1199602800000 / 1000)