2012-05-11 7 views
2

J'ai un champ datetime (P_DT) et je voudrais retourner tous les résultats où P_DT est supérieur à un timestamp unix d'entrée.Convertir Unixtime en Datetime SQL (Oracle)

Oracle dispose-t-il de fonctions intégrées pouvant vous aider?

Dans mes searchs je trouve resuts pour DateTime à Unix, mais pas Unix DateTime ...

+0

' numtodsinterval ('. $ _ GET ["date"].', \ SECOND \ ') '... Vous êtes vulnérable aux injections SQL avec ceci: utilisez plutôt des requêtes paramétrées pour passer directement les valeurs par concaténation de chaînes. – Bruno

Répondre

13

Il n'y a pas de fonctions intégrées. Mais il est relativement facile d'en écrire un. Depuis un horodatage Unix est le nombre de secondes depuis le 1er Janvier, 1970

CREATE OR REPLACE FUNCTION unix_ts_to_date(p_unix_ts IN NUMBER) 
    RETURN DATE 
IS 
    l_date DATE; 
BEGIN 
    l_date := date '1970-01-01' + p_unix_ts/60/60/24; 
    RETURN l_date; 
END; 

que vous pouvez voir être appelé

SQL> select unix_ts_to_date(1336822620) from dual; 

UNIX_TS_TO_DATE(133 
------------------- 
2012-05-12 11:37:00 
+0

J'ai fini par utiliser to_date (\ '1970-01-01 \', \ 'AAAA-MM-JJ \') + numtodsinterval ('. $ _ GET ["date"].', \ 'SECOND \') Où date est un code dans l'URL de l'horodatage unix. Mais votre solution est beaucoup plus "officielle" –

+2

Un timestamp Unix est le nombre de secondes écoulées depuis le 1er janvier 1970 00:00:00 ** UTC **. À moins que le serveur de base de données ne fonctionne sur UTC, vous devez utiliser '(TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + numtodsinterval (p_unix_ts, 'second')) À LOCAL' –

0

J'ai utilisé ce à la fin ...

date=unixtimestamp number 

to_date(\'1970-01-01\',\'YYYY-MM-DD\') + numtodsinterval('.$_GET["date"].',\'SECOND\')