2011-01-31 33 views
6

Estoy trabajando con una base de datos DB2 por primera vez.Convertir una cadena en una fecha en DB2

Estoy tratando de trabajar con fechas de DB2, pero los datos se almacenan como una cadena en la base de datos DB2.

quiero convertir esta fecha-cadena en una fecha real, preferentemente de dejar a tiempo porque quiero que todas las transacciones entre el 1 2011 ene y 26 de enero de 2011.

Así que, esencialmente, quiero esta declaración MS SQL en DB2 magia ...

CONVERT(datetime,SETTLEMENTDATE.VALUE,103) 

Para el fondo, me han llegado tan lejos como

CAST(SETTLEMENTDATE.VALUE, DATE) 

Y

DATE(SETTLEMENTDATE.VALUE) 

¡Pero necesito el conocimiento experto de un whizzkid de DB2!

Gracias

+0

me gustaría que nuestras fechas fueran cadenas en nuestro DB2 ... ¡son enteros! y hay 6 fechas de números (YYMMDD) (y 8 fechas de números (AAAAMMDD) - ¡la solución al problema del Y2K!) ... así que en las 6 fechas de los números, el valor 111 es realmente el 11 de enero de 2000 ... hablar de desordenado conversiones! – Leslie

+0

@Leslie ... ¡Te cambiaré! :) – Fenton

+0

¿Podría publicar datos de muestra de la columna SETTLEMENTDATE.VALUE? –

Respuesta

14

Sobre la base de su propia respuesta, supongo que su columna se ha formateado los datos de la siguiente manera:

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

Los separadores reales entre día/mes/año no importan, ni nada de lo que viene después el año.

No dice qué versión de DB2 está utilizando o en qué plataforma se está ejecutando, así que supongo que está en Linux, UNIX o Windows.

Casi cualquier versión reciente de DB2 para Linux/Unix/Windows (8.2 o posterior, posiblemente incluso versiones anteriores), se puede hacer esto utilizando la función TRANSLATE:

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

Con esta solución no lo hace importa lo que viene después de la fecha en tu columna.

En DB2 9.7, también se puede utilizar la función TO_DATE (similar a TO_DATE de Oracle):

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

Esto requiere sus datos coinciden con la cadena de formato; es más fácil de entender al mirarlo, pero no tan flexible como la opción TRANSLATE.

+0

Hola Ian, gracias por esta respuesta. Sabía que debía haber una mejor manera de lo que estaba haciendo. ¡Gracias! – Fenton

0

Está bien, parece un poco de un truco. He conseguido que funcione utilizando una subcadena, por lo que sólo la parte de la cadena con la fecha (no en el tiempo) se pasa a la función FECHA ...

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

yo todavía aceptar respuestas que son mejor que este!

+0

Si bien esta forma de hacer las cosas funciona, vea la respuesta de Ian Bjorhovde, ¡la cual he aceptado anteriormente! – Fenton

-3

Se puede utilizar:

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

Creo que están pidiendo cadena hasta la fecha y no tienen fecha para la cadena – Amir

4

Sé que su antiguo puesto, pero todavía quiero contribuir
anterior no funcionará si tiene formato de datos como éste
'YYYMMDD'

Por ejemplo:

Dt 
20151104 

Así que traté de seguir para obtener el resultado deseado.

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

Además, Si desea ejecutar la consulta de MS SQL servidor vinculado a DB2 (Para mostrar sólo 100 filas).

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

Resultado después de consulta anterior:

Dt 
2015-11-04 

Espero que esto ayude a los demás.

Cuestiones relacionadas