Marked as: Advanced
Hello,
here's my example on how to check if a value is a date, time or timestamp. It's not that very well tested yet so use with care.
Can you improve it? tell me what to do!
Note: It's possible to modify it to overload the builtin function DATATYPE, just check Rexx Tips & Tricks if you want to create your own datatype and test it.
datatypes: procedure
if ARG() = 2 then
do
if length( strip( ARG(1) ) ) = 0 then
if pos( 'EMPTY', translate( ARG(2) ) ) > 0 then Return 1
else Return 0
if pos( 'TIMESTAMP', translate( ARG(2) ) ) > 0 then
do
parse value ARG(1) with date_stamp' 'time_stamp','.
if rxDateType( date_stamp, 'I', rxNot ) then
if rxTimeType( time_stamp, 'L', rxNot ) then Return 1
end
else if pos( 'DATE', translate( ARG(2) ) ) > 0 then
do
if pos( 'E', translate( ARG(2) ) ) = 1 then
if rxDateType( ARG(1), 'E', rxNotEuropeanDate ) then Return 1
if pos( 'I', translate( ARG(2) ) ) = 1 then
if rxDateType( ARG(1), 'I', rxNotISODate ) then Return 1
if pos( 'N', translate( ARG(2) ) ) = 1 then
if rxDateType( ARG(1), 'N', rxNotNormalDate ) then Return 1
if pos( 'O', translate( ARG(2) ) ) = 1 then
if rxDateType( ARG(1), 'O', rxNotOrderedDate ) then Return 1
if pos( 'S', translate( ARG(2) ) ) = 1 then
if rxDateType( ARG(1), 'S', rxNotStandardDate ) then Return 1
if pos( 'U', translate( ARG(2) ) ) = 1 then
if rxDateType( ARG(1), 'U', rxNot ) then Return 1
Return datatypes( ARG(1), 'EDATE' )
end
else if pos( 'TIME', translate( ARG(2) ) ) > 0 then
do
if pos( 'C', translate( ARG(2) ) ) = 1 then
if rxTimeType( ARG(1), 'E', rxNotCivilTime ) then Return 1
if pos( 'L', translate( ARG(2) ) ) = 1 then
if rxTimeType( ARG(1), 'L', rxNotLongTime ) then Return 1
if pos( 'N', translate( ARG(2) ) ) = 1 then
if rxTimeType( ARG(1), 'N', rxNot ) then Return 1
Return datatypes( ARG(1), 'ETIME' )
end
else Return Datatype( ARG(1), ARG(2) )
Return 0
end
else if datatypes( ARG(1), 'TIMESTAMP' ) then Return 'TIMESTAMP'
else if datatypes( ARG(1), 'DATE' ) then Return 'DATE'
else if datatypes( ARG(1), 'TIME' ) then Return 'TIME'
Return Datatype( ARG(1) )
rxDateType: procedure
interpret 'SIGNAL ON SYNTAX NAME '||ARG(3)
SIGNAL OFF NOVALUE
SIGNAL OFF FAILURE
SIGNAL OFF ERROR
SIGNAL OFF NOTREADY
if datatype( date( 'B', ARG(1), ARG(2) ), 'W' ) then Return 1
Return 0
rxTimeType: procedure
interpret 'SIGNAL ON SYNTAX NAME '||ARG(3)
SIGNAL OFF NOVALUE
SIGNAL OFF FAILURE
SIGNAL OFF ERROR
SIGNAL OFF NOTREADY
if datatype( time( 'S', ARG(1), ARG(2) ), 'W' ) then Return 1
Return 0
rxNotDateTime:
Return datatypes( ARG(1) )
rxNotEuropeanDate:
Return datatypes( ARG(1), 'IDATE' )
rxNotISODate:
Return datatypes( ARG(1), 'NDATE' )
rxNotNormalDate:
Return datatypes( ARG(1), 'ODATE' )
rxNotOrderedDate:
Return datatypes( ARG(1), 'SDATE' )
rxNotStandardDate:
Return datatypes( ARG(1), 'UDATE' )
rxNot:
Return 0
rxNotCivilTime:
Return datatypes( ARG(1), 'LTIME' )
rxNotLongTime:
Return datatypes( ARG(1), 'NTIME' )