문제

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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top