Pass-Through Proc SQL에서 타임 스탬프에서 DatePart를 사용하여 쿼리
-
21-12-2019 - |
문제
DB2 Pass-Through Proc SQL 코드에서 DB2 Pass-Through Proc SQL 코드의 내용에서 시간 스탬프의 날짜 부분을 사용하려고합니다.나는 Date와 DatePart 기능을 사용 하여이 형식으로 작업하지 않을 것입니다.아래의 동일한 코드에서 사용할 함수의 이름을 누구든지 알고 있습니까?
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의 DateTime 필드에서 기능을 사용하는 경우 데이터베이스는 인덱스 (해당 필드가 인덱싱 된 경우)를 사용할 수 없습니다. 이는 인덱스가 함수에 의해 처리 된 후 필드의 결과가 아닌 필드 자체에 생성 된 (거의 항상) 생성되기 때문입니다. 이는 DB2뿐만 아니라 대부분의 데이터베이스의 대부분에 대해서는 사실이 있습니다.
대신, 당신이하고 싶은 것은 하루의 시작과 하루가 끝날 때까지 DateTime 값을 공급하고 모든 것을 inbetween을 얻는 것입니다. 이 프로세스를 단순화하려면 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 의이 기사 이 기사는Timestamp (위의 것인가) 이외의 다른 형식이 있습니다.따라서 정확한 형식에 따라 다른 하나를 사용해야 할 수도 있습니다.
SAS-Date 리터럴을 사용해야합니다.그래서 :
where DATEPART(timestamp) > '12Jan2013'd
.