Запрос, используя дату даты от отпечатки времени в пропуске SQL

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

Вопрос

Я пытаюсь использовать дату часть Time-Stamp в My Suere Query в CQL SQL SQL CQL 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; 
.

Это было полезно?

Решение

Если вы используете функцию в поле DateTime в DB2, база данных не сможет использовать ее индексы (если это поле индексируется). Это связано с тем, что индексы (почти всегда) создаются на самом поле, а не в результате поля после того, как он был обработан функцией. Это верно для большинства баз данных не только DB2.

вместо этого, то, что вы хотите сделать, - это поставлять значения DateTime на начало дня и на конец дня и получить все между ними. Чтобы упростить этот процесс, я создал формат под названием 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));
.

Я бы тогда создал два поля DateTime, представляющие начало дня и конца дня, и я бы сохранил их в формате, необходимом для оператора 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, но Этот документ Это довольно хорошо.В частности:

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

Так выглядит как ваш запрос будет

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; 
.

Эта статья из IBM, кажется, предлагаетЕсть другие форматы, отличные от временной техники (что это то, что выше).Таким образом, вам может потребоваться использовать другой в зависимости от точного формата.

Я полагаю, вы должны использовать SAS-Date Lobalal.Итак:

 where DATEPART(timestamp) > '12Jan2013'd
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top