Запрос, используя дату даты от отпечатки времени в пропуске SQL
-
21-12-2019 - |
Вопрос
Я пытаюсь использовать дату часть 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
.