Pregunta

Estoy tratando de usar la fecha de la fecha de un sello de tiempo en mi consulta donde se encuentra en un código SQL de PASS a paso de DB2 a continuación.Intenté usar las funciones de Fecha y DatePart, pero no funcionará con este formato.¿Alguien sabe el nombre de la función para usar en el mismo código a continuación?

PROC SQL; 
   connect to db2(ssid=smtng); 
     select *  from connection to db2 
         (select *  
             from ATable 
          where DATEPART(timestamp) > '12/01/2013'
   FOR READ ONLY WITH UR
    );
DISCONNECT FROM DB2;
QUIT; 

¿Fue útil?

Solución

Si usa una función en el campo DateTime en DB2, la base de datos no podrá usar sus índices (si ese campo está indexado). Esto se debe a que los índices están (casi siempre) creados en el propio campo, no el resultado del campo después de que se haya procesado por una función. Esto es válido para la mayoría de las bases de datos no solo DB2.

En su lugar, lo que quiere hacer es suministrar valores de DateTime para el comienzo del día y para el final del día y obtener todo entre ellos. Para simplificar este proceso, creé un formato llamado mysqldt.. Originalmente, este formato fue para una base de datos MySQL, pero SQL Server y DB2 usan los mismos formatos, por lo que se puede usar en aquellos también:

proc format;
  picture mysqldt low-high = '''%Y-%0m-%0d %0H:%0M:%0S''' (datatype = datetime) ;
run ;

Una vez que este formato está disponible, tiendo a usar variables macro. En la parte superior de mi programa, crearía una variable macro donde especifico la fecha para usar en todo el informe:

%let rpt_date = %sysfunc(mdy(1,12,2013));

Luego crearía dos campos de fecha de tiempo que representan el inicio del día y el final del día, y los guardaría en el formato que se necesita para la declaración SQL:

%let sql_start = %sysfunc(dhms(&rpt_date, 0, 0, 0), mysqldt.);
%let sql_end   = %sysfunc(dhms(&rpt_date,23,59,59), mysqldt.);

%put &rpt_date &sql_start &sql_end;

Luego cambiaría su consulta para verse así:

proc sql; 
  connect to db2(ssid=smtng); 
  select *  from connection to db2 
         (select *  
          from atable 
          where timestamp between &sql_start and &sql_end
          for read only with ur
    );
quit; 

De esta manera, no solo se usan sus índices ahora en su consulta, pero el SQL se ve más limpio y se lee más fácilmente, y solo necesita cambiar la fecha del informe en un solo lugar (en la parte superior de su programa) si necesita para volver a ejecutar su informe.

Otros consejos

En general, debe usar la sintaxis DB2 correcta.No sé DB2, sino este papel cubreesto bastante bienEspecíficamente:

PROC SQL; 
CREATE TABLE ONE AS SELECT * FROM CONNECTION TO DB2 
 (SELECT A.ID, A.NAME, B.AMOUNT, B.POSTDATE 
FROM IDS A 
INNER JOIN BANK B 
ON A.ID = B.ID 
WHERE POSTDATE BETWEEN '2007-01-01-00.00.00.000000' 
 AND '2007-09-30-23.59.59.999999')

Entonces parece que su consulta sería

PROC SQL; 
   connect to db2(ssid=smtng); 
     select *  from connection to db2 
         (select *  
             from ATable 
          where DATEPART(timestamp) > '2013-12-01-00.00.00.00000'
   FOR READ ONLY WITH UR
    );
DISCONNECT FROM DB2;
QUIT; 

Este artículo de IBM parece sugerir queHay otros formatos distintos a la marca de tiempo (que es lo anterior).Por lo tanto, es posible que deba usar uno diferente según el formato exacto.

Creo, debes usar el literal de SAS-Fecha.Entonces:

 where DATEPART(timestamp) > '12Jan2013'd

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top