2011-01-31 17 views
6

Sto lavorando con un database DB2 per la prima volta.Conversione di una stringa in una data in DB2

Sto cercando di lavorare con date DB2, ma i dati vengono memorizzati come una stringa nel database DB2.

voglio convertire questo data-stringa in una data effettiva, preferibilmente di cadere tempo perché voglio tutte le transazioni tra il 1 gennaio 2011 e il 26 gennaio 2011.

Quindi, in sostanza, voglio che questa affermazione MS SQL in DB2 magia ...

CONVERT(datetime,SETTLEMENTDATE.VALUE,103) 

per lo sfondo, ho avuto per quanto

CAST(SETTLEMENTDATE.VALUE, DATE) 

E

DATE(SETTLEMENTDATE.VALUE) 

ma ho bisogno la conoscenza esperta di un whizzkid DB2!

Grazie

+0

Vorrei che le nostre date fossero stringhe nella nostra DB2 ... sono numeri interi! e ci sono 6 date numeriche (YYMMDD) (e 8 date numeriche (YYYYMMDD) - la soluzione al problema Y2K!) .... quindi nelle 6 date numero il valore 111 è davvero l'11 gennaio 2000 ... parla di disordinato conversioni! – Leslie

+0

@Leslie ... ti scambierò! :) – Fenton

+0

Potresti pubblicare dati di esempio dalla colonna SETTLEMENTDATE.VALUE? –

risposta

14

Sulla base della sua propria risposta, sto cercando di indovinare che la colonna ha dati formattati in questo modo:

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

I separatori effettive tra giorno/mese/anno non contano, né tutto ciò che viene dopo l'anno.

Tu non dici quale versione di DB2 che si sta utilizzando o che la piattaforma su cui sta girando, quindi ho intenzione di assumere che sia su Linux, UNIX o Windows.

Quasi qualsiasi versione recente di DB2 per Linux/Unix/Windows (8.2 o successivo, forse anche le versioni precedenti), è possibile farlo utilizzando la funzione TRANSLATE:

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

Con questa soluzione non è così importa cosa viene dopo la data nella tua colonna.

In DB2 9.7, è anche possibile utilizzare la funzione TO_DATE (simile a TO_DATE di Oracle):

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

Questo richiede i dati corrispondono alla stringa di formattazione; è più facile da capire quando lo guardi, ma non è flessibile come l'opzione TRANSLATE.

+0

Ciao Ian, grazie per questa risposta. Sapevo che doveva esserci un modo migliore di quello che stavo facendo. Grazie! – Fenton

0

Ok, sembra un po 'di hack. Ho preso a lavorare con una stringa, in modo che solo la parte della stringa con la data (non l'ora) viene passato alla funzione DATA ...

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

sarò ancora accettare risposte che sono meglio di questo!

+0

Mentre questo modo di fare le cose funziona, per favore vedi la risposta di Ian Bjorhovde, che ho accettato sopra! – Fenton

-3

È possibile utilizzare:

select VARCHAR_FORMAT(creationdate, 'MM/DD/YYYY') from table name 
+1

Credo che stiano chiedendo una stringa fino ad oggi e non data alla stringa – Amir

4

So che la sua vecchio post, ma ancora voglio contribuire
cui sopra non funziona se si dispone di formato di dati come questo
'YYYMMDD'

Ad esempio:

Dt 
20151104 

Così ho provato a seguire per ottenere il risultato desiderato.

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

Inoltre, Se si desidera eseguire la query da MS SQL server collegato a DB2 (Per visualizzare solo 100 righe).

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') 

Risultato dopo sopra query:

Dt 
2015-11-04 

Spero che questo aiuti per gli altri.

Problemi correlati