Archives of the TeradataForum
Message Posted: Fri, 30 Apr 2004 @ 19:55:41 GMT
SELECT 86399999 (DECIMAL(18,0)) T ,CAST ( ('1969-12-31' (DATE)) + T / 86400000.00000000 AS TIMESTAMP(3) ) + INTERVAL '17' HOUR + (T / 1000.000 MOD 86400) * CAST('00:00:01' AS INTERVAL HOUR TO SECOND)
T represents your @timestamp parameter.
There are several things happening in this computation:
1) Add the number of whole days (T / 86400000.00000000) to your starting date.
2) Add the '17:00:00' timestamp.
3) Add the remaining seconds.
1) Teradata has a max DECIMAL(18,0) which is less than your parameter DECIMAL(19,0)
2) The number 86400000 is the number of milliseconds in a day. In order to avoid rounding, you must use the DECIMAL(16,8) representation.
3) The remaining seconds are found by (T / 1000.000 MOD 86400), which is multiplied by the one-second HOUR TO SECOND INTERVAL to get the correct remaining HOUR TO SECOND duration.
For what it's worth, I came across an interesting bug while writing this solution. Multiplying intervals by a decimal number works correctly only for the hours, minutes, and seconds components. The fractional-second component does not multiply higher than the seconds component. To see what I mean, try the following SELECT:
SELECT CAST('00:00:00.1' AS INTERVAL HOUR TO SECOND) A ,999 * A ,1000 * A
|Copyright 2016 - All Rights Reserved|
|Last Modified: 23 Jun 2019|