الاستعلام باستخدام جزء التاريخ من طابع زمني في Proc SQL تمريري

StackOverflow https://stackoverflow.com//questions/24042609

سؤال

أحاول استخدام جزء التاريخ من الطابع الزمني في استعلام المكان الخاص بي في رمز SQL proc التمريري db2 أدناه.لقد حاولت استخدام وظائف التاريخ والتاريخ ولكنها لن تعمل مع هذا التنسيق.هل يعرف أحد اسم الوظيفة المراد استخدامها في نفس الكود أدناه؟

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; 
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم وظيفة في حقل التاريخ والوقت في DB2، فلن تتمكن قاعدة البيانات من استخدام فهارسها (إذا تمت فهرسة هذا الحقل).وذلك لأن الفهارس يتم إنشاؤها (دائمًا تقريبًا) في الحقل نفسه، وليس نتيجة الحقل بعد معالجته بواسطة دالة.وهذا ينطبق على غالبية قواعد البيانات وليس فقط DB2.

بدلاً من ذلك، ما تريد القيام به هو توفير قيم التاريخ والوقت لبداية اليوم ونهاية اليوم والحصول على كل شيء بينهما.لتبسيط هذه العملية قمت بإنشاء تنسيق يسمى mysqldt..في الأصل كان هذا التنسيق مخصصًا لقاعدة بيانات mySQL، ولكن يستخدم كل من SQL server وDB2 نفس التنسيقات بحيث يمكن استخدامه في تلك أيضًا:

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

بمجرد توفر هذا التنسيق أميل إلى استخدام متغيرات الماكرو.في الجزء العلوي من برنامجي، سأقوم بإنشاء متغير ماكرو حيث أحدد التاريخ الذي سيتم استخدامه خلال التقرير:

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

سأقوم بعد ذلك بإنشاء حقلين للتاريخ والوقت يمثلان بداية اليوم ونهاية اليوم، وسأحفظهما بالتنسيق المطلوب لعبارة 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;

يمكنك بعد ذلك تغيير الاستعلام الخاص بك ليبدو كما يلي:

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; 

بهذه الطريقة، لن يتم استخدام الفهارس الخاصة بك الآن في الاستعلام الخاص بك فحسب، بل يبدو SQL أكثر وضوحًا وقراءة أسهل، وتحتاج فقط إلى تغيير تاريخ التقرير في مكان واحد (في الجزء العلوي من البرنامج) إذا كنت بحاجة إلى إعادة تشغيل تقرير.

نصائح أخرى

بشكل عام، تحتاج إلى استخدام بناء جملة DB2 الصحيح.لا أعرف DB2، لكن هذه الورقة يغطيهذا جيدا إلى حد ما.على وجه التحديد:

giveacodicetagpre.

لذلك يبدو أن استفسارك سيكون

giveacodicetagpre.

> يبدو أن هذه المقالة من IBM تشير إلى ذلكهناك تنسيقات أخرى غير الطابع الزمني (وهو ما هو أعلاه).لذلك قد تحتاج إلى استخدام واحدة مختلفة اعتمادا على التنسيق الدقيق.

أعتقد، يجب عليك استخدام SAS-Date الحرفي.لذلك:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top