On 17-Apr-2015 13:25 -0500, CRPence wrote:
On 17-Apr-2015 11:39 -0500, Dan wrote:
<<SNIP>>
With the additional 6 digits, I presume that more space is needed
to store them than before.
No. Same internal storage irrespective the specified precision. The
difference is merely the amount of precision /visible/ both for
storage and for presentation. IIRC the total amount of storage for
the TIMESTAMP value is 10-bytes, irrespective the amount of precision
from 0 to 12 digits.
<<SNIP>>
  After seeing Rob's reply, despite concerns with the possibility of 
skewed results due to the calculation methodology of the example given, 
I figured I must have been wrong in my above reply.  I had to go 
digging, to figure out what I must have mis-remembered.
  Apparently I incorrectly had recalled what was the amount of internal 
storage required for TIMESTAMP(6) values; I had indicated the storage 
was already sufficiently capable of recording values of type 
TIMESTAMP(12) too.  Since confirmed, the larger precision requires more 
storage.  The storage for TIMESTAMP(6) is indeed 10-bytes, however any 
additional precision will require minimally one byte, and up to a 
maximum of three bytes *more storage* than is required to store the 
default precision of six digits.  That implies TIMESTAMP(P>6) will 
require more than the 10-bytes.
  Because... Apparently the well-defined storage requirement for the 
internal representation of a TIMESTAMP value with a variable-precision 
[from 0 to 12], ranges from 7 to 13 bytes.  For any TIMESTAMP(P), the 
amount of storage required, in bytes, is defined by the arithmetic 
expression: 7+((P+1)/2)
  That expression is derived from, essentially, an summation of the 
storage-length requirements of the three distinct TIMESTAMP components 
of Date, Time, and Subseconds:
  stglen(date_data)+stglen(time_data)+stglen(subsecond_precision_P)
  rewritten as: stglen(UINT4)+stglen(UDEC(6))+stglen(UDEC(P))
  rewritten as: 4+3+((P+1)/2)
  rewritten as: 7+((P+1)/2)
  Assuming a typical precedence of arithmetic operators, the expression 
7+(P+1)/2 is the same as the above with a parenthetical integer 
division, and is what is used to describe the storage size calculation 
in the doc reference below:
<
https://www.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_72/rzatk/MINDTCON.htm>
"...
_Date, Time, and Timestamp Concepts_
_Data Definitions_
 ...
TIMESTAMP
    /Timestamp data type/ The internal format of a Timestamp is a seven 
to thirteen byte composite value. The composite is two numbers: one for 
date and time respectfully. The date and time numbers have the same 
encoding as the date and time data types, with an exception to the time 
number. The time number has an additional 0 to 6 bytes for a zero to 
twelve packed digit fractional second value. The default is 3 bytes for 
a six packed digit microsecond value.  The DDAT number must reference a 
DDAT with an internal Timestamp format code or be set to zero which 
implies internal format. The internal format does not allow trailing blanks.
    The timestamp data type supports a second precision. The length can 
be determined from the precision by using the following formula: 
7+(p+1)/2 where p is the precision. The default precision is 6 which 
gives a length of ten.
 ..."
  Contrast that updated 7.2 doc, to the previous release documentation, 
in which the size is clearly noted to be a constant 10-bytes:
<
https://www.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_71/rzatk/MINDTCON.htm>
"...
_Date, Time, and Timestamp Concepts_
_Data Definitions_
 ...
TIMESTAMP
    /Timestamp data type/ The internal format of a Timestamp is a ten 
byte composite value. The composite is two numbers: one for date and 
time respectfully. The date and time numbers have the same encoding as 
the date and time data types, with an exception to the time number. The 
time number has an additional 3 bytes for a six packed digit microsecond 
value. The DDAT number must reference a DDAT with an internal Timestamp 
format code or be set to zero which implies internal format. The 
internal format is fixed length, trailing blanks are NOT allowed.
..."
  Note: Despite knowing that fewer digits of precision require fewer 
bytes of storage for actual TIMESTAMP values, I am not aware if that 
variability necessarily would be reflected consistently for the column 
definitions of a database file; the implementation for those *could* be 
different, yet still accommodating, even though I am doubtful that would 
be the case.  For example there could be just two implementation sizes, 
10b [accommodating P=range(0:6)] and 13b [accommodating P=range(7:12)]; 
such an implementation would have a payoff for an ALTER that merely 
changes the TIMESTAMP precision to a value within the existing range and 
could possibly benefit algorithms with reduced variance [perhaps keyed 
access path building?], while probably having little impact to the 
algorithms for storage and presentation because the required action 
likely would be nothing more than an early-exit from including 
remaining\additional precision digits [as input or output, respectively].
As an Amazon Associate we earn from qualifying purchases.