SQL CAST Function
CAST may be used to convert data types.
Casting a Date
The snippett illustrate using a cast in a DECLARE statement. Set cursor for a file where the transaction must fall within the from and to date on file. Substring and concatenate the transaction date to cast as a date type field for the compare.
//*----------------------------------------------------------------------
//* SetPaymentCursor - this procedure creates a dynamic cursor for the use
//* in fetching the payment records for the loan statement.
//*
//* Parameter ATR I/O Description
//* ---------- --- --- -----------
//* error indicator n O Error indicator
//*
//*----------------------------------------------------------------------
p SetPaymentCursor...
p b export
d SetPaymentCursor...
d pi n
d isFound s n inz(*off)
d errorOccurred s n inz(*off)
d qt s 1a inz('''')
d QRYstring s 1024a
d len s 3S 0
/free
//*---------------------------------
//* Substring and concatenate the
//* transaction date to cast as a
//* date type field for the compare.
//*---------------------------------
QRYstring = 'Select * From VayPay Where vaLoan = ? +
and vtxfer = ? and vacode <> ''cnv'' and +
CAST( concat(substr(DIGITS(VATRDTE),1,4),concat(''-'', +
concat(substr(DIGITS(VATRDTE),5,2),concat(''-'', +
substr(DIGITS(VATRDTE),7,2))))) AS DATE) +
>= ? and +
CAST( concat(substr(DIGITS(VATRDTE),1,4),concat(''-'', +
concat(substr(DIGITS(VATRDTE),5,2),concat(''-'', +
substr(DIGITS(VATRDTE),7,2))))) AS DATE) +
<= ? ';
EXEC SQL PREPARE selectString FROM :QRYstring;
EXEC SQL DECLARE payment4048Cursor
SCROLL CURSOR FOR selectString;
IF SQLSTT = SQLSTTOK ;
ErrorOccurred = *off ;
ELSE ;
ErrorOccurred = *ON ;
ENDIF ;
RETURN ErrorOccurred ;
/end-free
p SetPaymentCursor...
p e
The example below demonstrates multiple uses of CAST. The column DOCLINENUM is being cast as a nine digit decimal. The date column is being cast as an eight digit numeric value. And the VALUEHOME column, which was defined on the table as having only two decimal positions is cast as having three decimal positions.
Exec SQL
Declare WR1010cursor Cursor For
Select
Substr (doccode,1,4) as Dtype,
subStr (docNum,5,8) as docNo,
cast(doclinenum as decimal(9,0)) as ieRef,
substr(ref3,1,20) as dxref3,
substr (el2,1,12) as dacct1,
substr (el3,1,12) as dacct2,
substr (el4,1,12) as dacct3,
substr (el5,1,12) as dacct4,
case when(statpay = 84) then 'A'
when(statpay = 87) then 'H'
when(statpay = 89) then 'P'
when(statpay = 93) then 'R'
when(statpay = 171) then 'X'
Else ' '
End as DDstat,
substr(DDescr,1,30) as Dddesc,
yr,
period,
substr(ref2,1,10) as Dxref2,
ifNull(Cast(Replace(Char(DOCDATE, ISO), '-', '')
as dec(8, 0)),'0') as iVdat,
substr(ref1,1,20),
Cast(valueHome as decimal(18,3)) as ddValu
From OAS_DOCV1
Where el2 = :thisAccount
and yr = :thisyear
and period = :thisPeriod
and cmpCode = :thisCompany
Order by docCode, DocNum ;