Question

Je suis en train d'utiliser la partie de la date d'un horodatage dans ma où requête dans une base de données db2 pass-through proc SQL code ci-dessous.J'ai essayé à l'aide de la date et de l'datepart mais il l'habitude de travailler avec ce format.Personne ne sait le nom de la fonction à utiliser dans le code ci-dessous?

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; 
Était-ce utile?

La solution

Si vous utilisez une fonction sur le champ datetime dans DB2 ensuite la base de données ne sera pas en mesure d'utiliser l'index (si ce champ est indexé).C'est parce que les indices sont (presque toujours) créé sur le champ lui-même, et non pas le résultat du champ après qu'il a été traité par une fonction.Cela est vrai pour la majorité des bases de données et pas seulement DB2.

Au lieu de cela, ce que vous voulez faire est de l'approvisionnement des valeurs datetime pour le début de la journée et de la fin de la journée et tout entre eux.Pour simplifier ce processus, j'ai créé un format appelé mysqldt..À l'origine, ce format a été pour une base de données mySQL, mais SQL server et DB2 deux utilisent les mêmes formats de sorte qu'il peut être utilisé sur les documents suivants:

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

Une fois que ce format est disponible, j'ai tendance à utiliser des macro-variables.Du haut de mon programme, je voudrais créer une macro variable où je spécifier la date à utiliser dans le rapport:

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

J'ai alors créer deux champs de type dateheure représentant le début de la journée et de la fin de la journée, et je voudrais les enregistrer dans le format qui est nécessaire pour l'instruction 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;

Vous pouvez alors modifier votre requête à ressembler à ceci:

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 cette façon, non seulement votre index maintenant utilisé dans votre requête, mais le SQL semble plus propre et le lit est plus facile, et vous avez seulement besoin de changer la date du rapport en un seul endroit (en haut de votre programme) si vous avez besoin de relancer votre rapport.

Autres conseils

En général, vous devez utiliser la syntaxe DB2 correcte.Je ne sais pas db2, mais Cet article couvreCela assez bien.Plus précisément:

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

Il semble que votre requête serait

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; 

Cet article d'IBM semble suggérer queIl y a d'autres formats autres que l'horodatage (ce qui est ce qui précède).Donc, vous devrez peut-être utiliser un autre en fonction du format exact.

Je crois, vous devriez utiliser littéral sas-date.Donc:

 where DATEPART(timestamp) > '12Jan2013'd

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top