database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 4085 게시물 읽기
No. 4085
Sybase ASE12.5 String --> Date 형 변환 도와주세요.
작성자
박현진(promessa110)
작성일
2011-01-26 13:48ⓒ
2011-01-26 13:49ⓜ
조회수
6,721

 안녕하세요

 
혼자서는 해결하기가 어려워서 
고수님들의 조언을 듣고자 글을 남겨봅니다..
 
 
DB연계를 하면서 source DB 가 Sybase ASE 12.5이고 Target DB가 Oracle 10g를 사용.
여기서 문제는 source DB에 created(생성일)의 컬럼의 값이
 
created  Dec 01, 2006 12:00:00 AM   getDate 형식으로 되어있고 
 
Sybase ASE 12.5 에서 가져온 데이터를 아래와 같이 "yyyyMMddHHmmss"  형식으로
 
이 컬럼을 target DB (오라클)에서는 varchar2(20) 으로  문자열로 Insert 를 시키고 있습니다.
 
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMddHHmmss");
 
작업시작일을 START_DAY 로 작업 종료일을 END_DAY로 설정을 해서 
 
작업 시작일과 작업종요일을 eai_ita_periodical_schdule.properties File 파일에 입력을 해 놓고 
 
source DB에서 select 를 할때 조건문으로 사용하는 로직입니다.
 
eai_ita_periodical_schdule.properties File 
 
#Tue Jan 25 18:02:50 KST 2011
START_DAY=20110124
END_DAY=20110119
 
작업을 시작할때마다 그 값들을 불러와서 WHERE 조건문으로 사용을 할려고 합니다.
 
그런데 여기서 발생하는 문제점이 String 형으로 되어있는 endDay와 startDay 에있는 
 
값을 데이트 형식으로 변환을 해줘야 한다는 것입니다.(오라클의 to date 와 같은 함수)
 
Sybase ASE12.5에 관해 여러가지 자료를 찾아보고 그랬지만 아직 해결을 하지 못하고 있습니다.
 
자바 고수님들이 조언/해결 방안을 부탁 드립니다..
 
 
 
// =================  파일 생성 하는 소스 부분================== //
 
// 현재 시각
String nowTime = getFormattedDate("yyyyMMdd");
String propFileNm = ""; // 프로퍼티 파일명
String schPropFileNm = "";
 
try {
// 프로퍼티 파일명 설정 (각 테이블명으로 생성)
propFileNm = eaiTblNm.toLowerCase() + ".properties";
logger.debug("[onSignal] Property file name [" + propFileNm + "]");
propFileNm = mPROPERTIY_PATH + mFILE_SEP + propFileNm;
 
// 프로퍼티 파일의 속성값 및 어댑터의 환경 변수 검사
chkAdaptorEnv(propFileNm, eaiTblNm, nowTime);
 
// EAI_TR_ID 생성시 중복 방지를 위해 조회 건수만큼 Interval 을 준다.
standByBatchJob(propFileNm, eaiTblNm);
 
// Schedule 프로퍼티 경로설정 (각 테이블명으로 생성)
 
schPropFileNm = eaiTblNm.toLowerCase() + "_schedule"
+ ".properties";
logger.debug("[onSignal] Schedule Property file name ["
+ schPropFileNm + "]");
schPropFileNm = mPROPERTIY_PATH + mFILE_SEP + schPropFileNm;
 
// Schedule 프로퍼티파일 설정 (각 테이블명으로 생성)
createPropeties(schPropFileNm);
endDay = getTblProperty(schPropFileNm,"END_DAY");
if(endDay == null || endDay.trim().length() == 0){
endDay = setCalendar(startDay, -7);
startDay = setCalendar(startDay,-1);
logger.info("[ WORK START DAY 초기값 : " + startDay + " ] " );
logger.info("[ WORK END DAY 초기값 : " + endDay + " ] " );
}else{
endDay = setCalendar(endDay,+1);
startDay = setCalendar(startDay,-1);   
}
} catch (Exception ex) {   
throw ex;
}
 
//===================== 퀴리문 생성하는 구문 =================================//
private PreparedStatement makeStatement(IDBManager pDbMgr,
HashMap pTblInfo, String pUsrWhere, String pPkIdxVal,
int[] pPkIdxArr) throws Exception {
logger.info("########## makeStatement 시작  #############");
logger.info("== String pUsrWhere   : " + pUsrWhere + " ==");
logger.info("=== pTblInfo :" + pTblInfo.size() + "size " + "===");

logger.info("##########################################");
PreparedStatement pstmt = null;
StringBuffer sb = new StringBuffer("");
String[] columName = (String[]) pTblInfo.get("COLUMN_NAME");

try {
// Concatenation Operators
String sep = "&SEP&", prefix = "&PREFIX&", suffix = "&SUFFIX&";
String lWhere = "", lOrder = "";

// set where clause - 기존에 조회한 내역이 있을 경우에만 설정
if (pPkIdxVal != null && !pPkIdxVal.equals("")) {
if (pPkIdxArr != null && pPkIdxArr.length > 0) {
for (int k = 0; k < pPkIdxArr.length; k++) {
if ((k + 1) < pPkIdxArr.length)
lWhere += prefix + columName[pPkIdxArr[k] - 1]
+ suffix + sep;
else
lWhere += prefix + columName[pPkIdxArr[k] - 1]
+ suffix;
logger.info("[ lWhere 절의 내용을 출력 : " + lWhere + " ]");
}
}
}

// set order by
if (pPkIdxArr != null && pPkIdxArr.length > 0) {
for (int k = 0; k < pPkIdxArr.length; k++) {
if ((k + 1) < pPkIdxArr.length)
lOrder += prefix + columName[pPkIdxArr[k] - 1] + suffix
+ sep;
else
lOrder += prefix + columName[pPkIdxArr[k] - 1] + suffix;
}
}
String prodName = pTblInfo.get("PRODUCT_NAME").toString()
.toUpperCase();
logger.debug("[makeStatement] DBMS Product_Name : " + prodName);

// MS-SQL Select Query 생성
if (prodName.indexOf("SQL SERVER") > -1) {
sb.append(pTblInfo.get("SELECT4MSSQL").toString());

// MS-SQL은 || 대신 '+'를 사용하여 concatenation 을 한다
sep = " + '" + mDELIMITER + "' + ";

// 문자열형이 아닐 경우 concatenation 의 사용은 오류 발생하므로 형변환을 거친다
prefix = "rtrim(cast(";
suffix = " as varchar(100)))";
}
// Sybase - Adaptive Server Enterprise
else if (prodName.indexOf("ADAPTIVE") > -1) {
sb.append("select * from "
+ pTblInfo.get("TABLE_NAME").toString());

// Sybase '+'(또는 ||)를 사용하여 concatenation 을 한다
sep = " + '" + mDELIMITER + "' + ";

// 문자열형이 아닐 경우 concatenation 의 사용은 오류 발생하므로 형변환을 거친다
prefix = "rtrim(cast(";
suffix = " as varchar(100)))";
}
// MySql
else if (prodName.indexOf("MYSQL") > -1) {
sb.append("select * from "
+ pTblInfo.get("TABLE_NAME").toString());

// MySql concat()를 사용하여 concatenation 을 한다. cast 에는 varchar 형이
// 없다.
sep = ", '" + mDELIMITER + "', ";
prefix = "trim(cast(";
suffix = " as char(100)))";

if (!lWhere.equals(""))
lWhere = "concat(" + lWhere + ")";

if (!lOrder.equals(""))
lOrder = "concat(" + lOrder + ")";
}
// Oracle, etc
else {
sb.append("select * from "
+ pTblInfo.get("TABLE_NAME").toString());
sep = " || '" + mDELIMITER + "' || ";
prefix = "trim(cast(";
suffix = " as varchar(100)))";
}
// 20110124 startDay / endDay 추가 조건절 삽입
sb.append(" where created between " + "CONVERT(char(19), getdate(),107) and " + "CONVERT(char(19), getdate(),107)");
                  
// ===============================================================
if (pUsrWhere != null && !pUsrWhere.equals("")) {
sb.append(" WHERE " + pUsrWhere); // 사용자 지정 where clause
if (!lWhere.equals(""))
sb.append(" AND " + lWhere + " > ?"); // bind variable
} else {
if (!lWhere.equals(""))
sb.append(" AND " + lWhere + " > ?"); // bind variable
}

if (!lOrder.equals(""))
sb.append(" order by " + lOrder);

String sSql = sb.toString();
logger.debug("[makeStatement] before sSql : \n" + sSql);

sSql = sSql.replaceAll("&SEP&", sep);
sSql = sSql.replaceAll("&PREFIX&", prefix);
sSql = sSql.replaceAll("&SUFFIX&", suffix);
logger.debug("[makeStatement] after sSql : \n" + sSql);

// PreparedStatement 생성    
pstmt = pDbMgr.getConnection().prepareStatement(sSql);

// where 조건절의 값이 있을 경우 설정
if (pPkIdxVal != null && !pPkIdxVal.equals(""))
pstmt.setString(1, pPkIdxVal);
;
} catch (SQLException se) {
logger.error("[makeStatement] SQLException : " + se.toString());
throw se;
} catch (Exception ex) {
logger.error("[makeStatement] Exception : " + ex.toString());
throw ex;
}
return pstmt;
}

이 글에 대한 댓글이 총 1건 있습니다.

편법을 사용해 봤습니다.

select rtrim(convert(char, getdate(), 112)) + str_replace(convert(char, getdate(), 108),':',null)

getdate() 대신에 컬럼명을 사용하시면 될거 같습니다.

김충관(kcg1932)님이 2011-02-23 15:10에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4089오라클의 아카이브파일과 유사한 것이 있을까요? [1]
김대훈
2011-02-17
4730
4088Sybase 에서 with 구문이 먹히나요? [1]
강정석
2011-02-09
6723
4087오라클에서 실행되는 문장인데요. [1]
이은정
2011-02-09
5883
4085Sybase ASE12.5 String --> Date 형 변환 도와주세요. [1]
박현진
2011-01-26
6721
4084sybase 12.7 > 15 버전 [1]
최종욱
2011-01-06
6351
4082Sybase ASE가 갑자기 기동이 안됩니다. [1]
임희성
2010-12-30
5689
4081str_replace에 대해 질문드립니다^^ [2]
김동한
2010-12-27
5331
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2021 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v13.3으로 자료를 관리합니다