web-dev-qa-db-fra.com

Conversion d'une chaîne en date dans DB2

Je travaille pour la première fois avec une base de données DB2.

J'essaie de travailler avec des dates DB2, mais les données sont stockées sous forme de chaîne dans la base de données DB2.

Je souhaite convertir cette chaîne de date en date réelle, de préférence en retardant mon arrivée, car je veux toutes les transactions effectuées entre le 1er janvier 2011 et le 26 janvier 2011.

Donc, je veux essentiellement cette instruction MS SQL dans DB2 Magic ...

CONVERT(datetime,SETTLEMENTDATE.VALUE,103)

Pour le fond, j'ai aussi loin que

CAST(SETTLEMENTDATE.VALUE, DATE)

ET

DATE(SETTLEMENTDATE.VALUE)

Mais j'ai besoin des connaissances d'un DB2 whizzkid!

Merci

6
Fenton

En vous basant sur votre propre réponse, je suppose que les données de votre colonne ont le format suivant:

'DD/MM/YYYY HH:MI:SS'

Les séparateurs réels entre Jour/Mois/Année importent peu, pas plus que ce qui vient après l’année.

Vous ne dites pas quelle version de DB2 vous utilisez ou sur quelle plate-forme elle est exécutée, je vais donc supposer que c'est sous Linux, UNIX ou Windows.

Presque toutes les versions récentes de DB2 pour Linux/UNIX/Windows (8.2 ou version ultérieure, voire des versions antérieures), vous pouvez le faire à l’aide de la fonction TRANSLATE:

select 
   date(translate('GHIJ-DE-AB',column_with_date,'ABCDEFGHIJ'))
from
   yourtable

Avec cette solution, peu importe ce qui vient après la date de votre colonne.

Dans DB2 9.7, vous pouvez également utiliser la fonction TO_DATE (similaire à TO_DATE d'Oracle):

date(to_date(column_with_date,'DD-MM-YYYY HH:MI:SS'))

Cela nécessite que vos données correspondent à la chaîne de formatage; c'est plus facile à comprendre quand on le regarde, mais pas aussi flexible que l'option TRANSLATE.

16
Ian Bjorhovde

Je connais son ancien post mais je souhaite quand même contribuer
Ci-dessus ne fonctionnera pas si vous avez un format de données comme celui-ci 
'YYYMMDD'

Par exemple:

Dt
20151104

J'ai donc essayé de suivre afin d'obtenir le résultat souhaité.

select cast(Left('20151104', 4)||'-'||substring('20151104',5,2)||'-'||substring('20151104', 7,2) as date) from SYSIBM.SYSDUMMY1;

En outre, si vous souhaitez exécuter la requête depuis le serveur lié MS SQL vers DB2 (pour afficher uniquement 100 lignes). 

    SELECT top 100 * from OPENQUERY([Linked_Server_Name],
    'select cast(Left(''20151104'', 4)||''-''||substring(''20151104'',5,2)||''-''||substring(''20151104'', 7,2) as date) AS Dt 
    FROM SYSIBM.SYSDUMMY1')

Résultat après la requête ci-dessus:

Dt
2015-11-04

J'espère que cela aide pour les autres.

5
Denn

OK, ça ressemble un peu à un bidouillage. Je l'ai obtenu en utilisant une sous-chaîne, de sorte que seule la partie de la chaîne avec la date (pas l'heure) soit passée dans la fonction DATE ...

DATE(substr(SETTLEMENTDATE.VALUE,7,4)||'-'|| substr(SETTLEMENTDATE.VALUE,4,2)||'-'|| substr(SETTLEMENTDATE.VALUE,1,2))

J'accepterai quand même des réponses meilleures que celle-ci!

0
Fenton

Dans la fonction format, vous pouvez utiliser la fonction timestamp_format . Par exemple, si le format est AAAAMMJJ, vous pouvez le faire:

select TIMESTAMP_FORMAT(yourcolumnchar, 'YYYYMMDD') as YouTimeStamp 
from yourtable

vous pouvez ensuite adapter ensuite le format avec le format des éléments trouvé ici

0
Esperento57