2010-11-18 22 views
2

J'aimerais pouvoir obtenir la date et l'heure actuelles (horodatage) du serveur de base de données auquel j'ai une connexion, quelle que soit la base de données. (Idéalement, j'aimerais quelque chose qui fonctionne pour Oracle, DB2, SQL Server et Postgres). Recherche sur Internet, j'ai vu des allusions à la fonction LOCALTIMESTAMP et à NOW() et à CURRENT_TIMESTAMP, mais je n'ai vu aucune clarté quant à savoir si tout cela fonctionne vraiment d'une manière interopérable sur les SGBDR. Je suis prêt à coder des alternatives pour différents DB si nécessaire, mais je n'ai même pas vu de clarté sur la meilleure façon de le faire pour les différents fournisseurs de DB. Et sûrement si cela doit être fait différemment pour chacun, il doit y avoir une bibliothèque Java qui encapsule les connexions JDBC et cela?Comment puis-je obtenir la date et l'heure actuelles d'un serveur de base de données via JDBC, quel que soit le fournisseur de la base de données?

En plus de déterminer quelle fonction SQL à utiliser, je me demande aussi s'il y a un moyen standard pour faire une requête SQL qui est juste un appel de fonction - certains blocs de données semblent soutenir

SELECT fn(); 

. ..mais Oracle semble exiger l'ajout

...FROM DUAL; 

Je sais que le SQL « standard » est un peu louche, mais je me demandais si quelqu'un qui a plus d'expérience que moi de travailler dans des bases de données et avec JDBC et bibliothèques connexes peuvent être capable de me pointer dans la bonne direction.

merci!

Répondre

2

Les appels de fonction diffèrent selon les bases de données. Alors qu'avec PostgreSQL, il est simple SELECT fun_name() dans Oracle, vous devez ajouter FROM dual. Dans une autre base de données, je travaille avec: Informix vous appelez procédure/fonction pas avec SELECT mais avec execute procedure/function.

Je pense que la solution la plus simple consiste à vérifier pendant l'exécution quelle base de données est actuellement utilisée, puis à générer la requête requise par cette base de données.

+0

Merci à la fin, cela semble être la seule solution pratique, même décevante – Lee

1

current_timestamp est la fonction ansi, et pour la compatibilité vous pouvez utiliser deux: sélectionnez current_timestamp de double

+0

merci, je vais essayer ça! – Lee

+0

Le problème n'est-il pas que le dual est une chose Oracle? On dirait que mysql le fait mais pas PostgreSQL. – JOTN

+0

DB2: ... à partir de SysDummy1 –

0

Ou écrire une fonction/sp pour le faire et exécuter cela. Encapsuler les différences de plate-forme dans le SP.

+0

Malheureusement, je n'ai pas accès à ajouter quoi que ce soit aux systèmes de base de données cible en question :( – Lee

1

Vous devez également garder à l'esprit que différents SGBDR renverront la date et l'heure actuelles dans différents formats. À tout le moins, il y aura des différences dans le séparateur entre la date et l'heure, certaines incluront microsecondes par défaut, et certaines incluront le fuseau horaire par défaut.

+1

Tant que vous utilisez JDBC, vous devez utiliser getDate() sur le ResultSet et vous obtiendrez un objet java.sql.Date dans lequel vous n'avez pas besoin de vous soucier du formatage –

+0

DB2 for i utilise un séparateur de points: CURRENT_TIMESTAMP = 2010- 11-19-13,47.31.186787 –