× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@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.


As an Amazon Associate we earn from qualifying purchases.

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-2024 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.