×

Good News Everybody!

The new search engine is LIVE!

Please report any problems to david (at) midrange.com.




On 16-Mar-2018 15:03 -0600, Kendall Kinnear wrote:
I have this as part of a SQL select statement:

" timestamp(
CHAR( T01.MIDTSY ) || '-' ||
substr( digits( T01.MIMTIM ), 1, 2) || '.' ||
substr( digits( t01.MIMTIM ), 3, 2) || '.00'
) as Message_Timestamp
"

The DDL is not given, but presumably, the column named MIDTSY is data-type of DATE and MIMTIM is either NUMERIC(4) or DECIMAL(4).?


When I run the select statement using Run SQL Scripts out of IBM
Access Client Solutions I get back the row I expected with a
timestamp that looks like this: "2018-03-16 15:35:00.000000"


[IBM i 7.3->…->Datetime values->String representations of datetime values](https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/db2/rbafzdtstrng.htm)


The default date and time formats are set based on the date format (DATFMT), the date separator (DATSEP), the time format (TIMFMT), and the time separator (TIMSEP) parameters.


[IBM i 7.3->…->Datetime values->String representations of datetime values->Timestamp strings](https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/db2/rbafztsstrings.htm)

Table 1. Formats for String Representations of Timestamps
•Format Name :'Time Format'
----> :'Example'
-----------------------------------------------------------
•ISO timestamp :'yyyy-mm-dd hh:mm:ss.nnnnnnnnnnnn'
----> :'1990-03-02 08:30:00.010000000000'

•IBM® SQL :'yyyy-mm-dd-hh.mm.ss.nnnnnnnnnnnn'
----> :'1990-03-02-08.30.00.010000000000'

•14-26 char form:'yyyymmddhhmmssnnnnnnnnnnnn'
----> :'19900302083000'



When I embed the same select into an RPG ILE program, I get this
error and I can't see why:

"Select or omit error on field
Cast( Concat( Cast( RBAMI_1.MIDTSY AS Char(8) CCSID 37),'-'
, Substr((Cast(ABS(RBAMI_1.MIMTIM) AS Numeric(4, 0))), 1, 2),':'
, Substr((Cast(ABS(RBAMI_1.MIMTIM) AS Numeric(4, 0))), 3, 2),':00')
AS TimeStamp)
member RBAMI."


Seems possible, that the given expression, is not consistent with the given error; perhaps, that a revision had been made to the SQL expression [¿using colons vs periods as the literal/constants specified in the concatenation?], and that the error details were collected for an invocation with the modified expression, rather than collected for the originally failing invocation/expression? And that would explain why the suggestion from Charles would not assist -- if the colons were not changed back to periods. Probably no matter; see my further comment.


The second level text says:
Cause . . . . . : A select or omit error occurred in record 1,
record format *FIRST, member number 1 of file RBAMI in library
RBTALRLIB, because of condition 6 of the following conditions:
… 6 - A data mapping error occurred on the field before the select
or omit operation was attempted."

I know I probably have a setting wrong in my RPG LE program but I am
at a total loss as to where to look. Why would RPG LE be
interpreting the statement differently than Run SQL Script?

Seems probable, the DATFMT defaults differ betwixt; the CHAR(8) casting shown in the error as the effect, is conspicuously incorrect, per an inability of that result-type to contain the required 10-characters in the form of 'YYYY-MM-DD' (as shown, delimited with apostrophes) without any truncation, and thus is invalid as a representation of the date portion of a TIMESTAMP string (examples shown above, from doc reference). The RPG SQL seems to have been using a two-digit-year format when that error was issued; that is when a DATE cast to CHAR would be CHAR(8) vs CHAR(10).

Clearest IMO, is to overcome the issue by being explicit in the expression. Thus, irrespective any *default* setting, the desired CHAR casting will be effected properly; i.e. effected with the desired 10-character Date-string, preceding the first dash as constant in the expression:


" timestamp(
CHAR( T01.MIDTSY , ISO ) || '-' ||
substr( digits( T01.MIMTIM ), 1, 2) || '.' ||
substr( digits( t01.MIMTIM ), 3, 2) || '.00'
) as Message_Timestamp
"

Similarly, the option exists [¿more easily since IBM i 7.3; using the DECIMAL scalar (https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/db2/rbafzscadec.htm) for its "Datetime to Decimal" effect?] to eliminate any separators, and instead generate the 14-character non-delimited string representation of a TIMESTAMP; e.g. the untested expression:

" timestamp(
digits( decimal( T01.MIDTSY ) ) concat
digits( T01.MIMTIM ) concat '00'
) as Message_Timestamp
"

There is the less explicit option of ensuring that the RPG SQL establishes the proper Date Format (DATFMT) [note: in other scenarios, additionally, the Date Separator (DATSEP)]. That is by using the SET OPTION as Charles suggested in (https://archive.midrange.com/midrange-l/201803/msg00686.html) as a reply to the OP. While a solution for the program, the less explicit expression, if copied to a STRSQL session or to some other SQL scripting feature for which the Date Format is not matching the requirements, the error could reappear.


This thread ...

Follow-Ups:
Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2026 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.