ANSI Time and Dates:
1) Traditionally
the Date format is ‘YY/MM/DD’.
2) ANSI
format of Date is ‘YYYY-MM-DD’.
3) Teradata
makes this option selectable using the SET
SESSION DATEFORM option.
What does DATEFORM change?
1) This
controls how the date is displayed in reports etc.
2) Importing
and exporting strings. Ex: if ANSIDATE is selected and we import a character
string of format ‘YYYY-MM-DD’ then it can be directly placed inside the date
field. Similarly character string of format ‘YY/MM/DD’ can be directly inserted
to a date field if date format is INTEGERDATE (,i.e. Teradata default).
Otherwise we need to perform conversion before inserting into date field.
(Thus an imported
character string representing a date will be assumed to have the default
DATEFORM setting, unless otherwise indicated.)
Example:
CREATE
TABLE tbla
(tbldate
DATE);
SET
SESSION DATEFORM=ANSIDATE;
:
:
USING newdate (CHAR(10))
:
USING newdate (CHAR(10))
INSERT
INTO tbla (:newdate);
Here we can see that the
character field of format ‘YYYY-MM-DD’ from the external file can be directly
inserted to date field, because the date format is ANSIDATE .ie YYYY-MM-DD.
Same thing is true in case of mload and fastload.
What DATEFORM does not change?
This does not change the
way Teradata stores date data types.
Irrespective of date format, the date is always stored as integer (
4 bytes).
How to change the DATEFORM during a
session?
The SET SESSION DATEFORM
command sets the default date format for your session. The options available
are:
SET SESSION
DATEFORM=ANSIDATE; /*ANSI Default
format*/
SET SESSION
DATEFORM=INTEGERDATE;/'Teradata default*/
The SET command is an
SQL command, not a BTEQ command, thus no period precedes it.
The SET SESSION DATEFORM
command can be executed at any time during a session. It is switchable during a
session. ( some other settings need to be done before logging in)
What are 3 different places where
DATEFORM can be set?
The DATEFORM can be set
at following 3 places:
1) It
could be set in DBSCONTROL record. This will become the system default. This
can be done by setting register 14 in the DBACONTROL record.
MODIFY GENERAL 14=0 /* INTEGERDATE
(YY/MM/DD)*/
MODIFY GENERAL 14=1 /* ANSIDATE
(YYYY-MM-DD)*/
2) It
can also be set as part of defining the user. This will become default setting
for the user.
CREATE USER ped........
DATEFORM=ANSIDATE
=INTEGERDATE
3) It
can be set during the session as shown above. This setting will be active till
the user logs off.
SET SESSION DATEFORM=ANSIDATE
=INTEGERDATE
INTERVAL data types:
1.
Interval data types represent a
displacement between two points in time.
2.
Intervals are stored internally as one or
multiple numeric fields combined into a single data type.
3.
The two general interval types are:
Ø Year-Month
Intervals
Ø Day-Time
Intervals
YEAR-MONTH
intervals include:
Ø YEAR
Ø MONTH
Ø YEAR TO MONTH
DAY
–TIME intervals include:
Ø DAY
Ø HOUR
Ø MINUTE
Ø SECONDS.
Ø DAY
TO HOUR
Ø DAY
TO MINUTE
Ø DAY
TO SECOND
Ø HOUR
TO MINUTE
Ø HOUR
TO SECOND
Ø MINUTE
TO SECOND
4.
Year-month intervals can be combined with
DATE data type. Only “DAY” interval type from the DAY-TIME
intervals can be combined with DATE datatype. Thus interval types
that can be combined with DATE are DAY,MONTH,YEAR,YEAR TO MONTH
5.
Intervals may be converted from one type
to another using the CAST feature of SQL, however conversions are only possible within a general
category. .ie A YEAR interval may be converted to months, but it may
not be converted to days or hours.
6.
Year-Month intervals sizes are in range
1-4. Default
value is 2. This means MONTH interval type means MONTH(2).
Ø INTERVAL
YEAR(n) -9999 to +9999 years
Ø INTERVAL
MONTH(n) -9999 to +9999 months
Ø INTERVAL
YEAR(n) TO MONTH -9999 to 9999 years and 0-12 months
Where n is in the range of
1-4.
All
these interval data types are internally stored as SMALLINT. YEAR TO MONTH uses two small ints( one for year and other
for month.)
7.
If the default size of 2 is not
sufficient to hold the interval data then we should increase the size to max 4 .
8.
Intervals may be represented as literals
in SQL scripts as follows.
Example:
INTERVAL -'32' YEAR
INTERVAL '9' MONTH
INTERVAL '5-08' YEAR TO MONTH
Note
that interval literal is specified as word “INTERVAL” followed by the value in
quotes and then followed by the interval type.
For
YEAR TO MONTH don’t forget to use the “–“
Additional
rules for using interval literals are:
Ø Interval
if negative must have negative sign outside the quotes.
Ø The
plus sign '+' is the default, represented by a blank.
Ø Use
of an explicit '+' generates an error.
Ø Size
(n) is never specified with literals - the size is implicit in the interval.
Combining DATE with intervals:
1.
Date data types may be combined with
certain interval types(YEAR,MONTH,YEAR TO MONTH and DAY) to form a different
date. Only these 4 interval types can be used with Dates.
Date+INTERVAL = DATE.
2. Intervals
may be combined with certain interval types to form a different iinterval.
INTERVAL + INTERVAL =
INTERVAL.
3. Dates
may be subtracted from other dates to yield some interval of time between them.
DATE - DATE = interval.
4. Intervals
may also have mathematical operations performed on them such as division and
multiplication. This will yield a new interval.
INTERVAL */ n = INTERVAL
5. Examples:
SELECT CURRENT_DATE + INTERVAL '3'
YEAR;
2001-11-06
SELECT CURRENT_DATE + INTERVAL - '3'
YEAR;
1995-11-06
(Note
the negative literal is specified inside quotes and the sign is outside the
quotes).
SELECT (INTERVAL '5-10' YEAR TO
MONTH)+ (INTERVAL '2-03' YEAR TO MONTH);
8-01
When
multiple intervals are used in same query then it’s advised to enclose them in
brackets.
Working with Date literals:
1.
Date literals must always be represented using the ANSI standard
date format, regardless of the DATEFORM being used by the session.
The ANSI standard Date
format is: DATE 'YYYY-MM-DD'
2. Just
as with date data type, date literal we can added with YEAR, MONTH, YEAR TO
MONTH and DAY interval types.
SELECT DATE '1999-07-15'+ INTERVAL
'2-03' YEAR TO MONTH;
2001-10-15
SELECT (990715(DATE)) - INTERVAL '2'
YEAR;
1997-07-15
/*here we converted integer to DATE*/
3. Note
that when adding a month literal to a date, the same day of the new month will
be the reported result. However not all days exist in all months. The operation
will fail if the same day does not exist in the new month.
SELECT (DATE '1998-12-29'+ INTERVAL
'2' MONTH);
***Failure
2665 invalid date.
(Note:
There is no Feb. 29 in the year 1999)
The
appropriate mechanism for handling this situation is the ADD_MONTHS function.
This function allows any day of any month to be mapped to a day of the new
month. The ADD_MONTHS function takes into account that the month of February
has no day 30, 31 or even 29 in some years. The
ADD_MONTHS function should be used when each day must have a mapping in the new
month.
SELECT ADD_MONTHS(DATE
'1998-12-29',2);
ADD_MONTHS(1998-12-29,
2)
1999-02-28
Date Subtraction:
1.
Subtraction of Dates leads to integer
which is equal to number of days in between the two dates.
Ex: SELECT DATE '1999-03-01'- DATE
'1999-01-01';
59
This
gives the number of days in between two days. Note that this output is of data
type INTEGER.
2. If
we need to have result in DAY interval type then we have to write as follows:
Ex:
SELECT (DATE '1999-03-01' - DATE '1999-01-01') DAY;
59
This
result is an INTERVAL DAY (2) data type.
3. Examples:
Ex: SELECT (DATE '1999-03-01' - DATE
'1996-01-01') DAY;
**Failure
7453 Interval field overflow
This
is because the default field length for day is 2 digits and 1155 is 4 digits.
This
can be fixed by changing the output data type to DAY(4) . 4 is the maximum
length.
Ex: SELECT (DATE '1999-03-01' - DATE
'1996-01-01') DAY(4);
1155
Result
is an INTERVAL DAY (4) data type.
Ex: SELECT DATE '1999-03-01' - DATE
'1996-01-01';
This
would give 1155 value , but it would be of data type interval.
Ex: SELECT DATE '1999-03-01' - DATE
'1898-01-01';
36948
Result
is an INTEGER representing number of days. It cannot be represented as INTERVAL
because the maximum field length for the days interval is 4 digits, and this
number is 5 digits.
Ex: SELECT (DATE '1999-03-01'- DATE
'1899-01-01') YEAR TO MONTH;
***Failure
7453 Interval field overflow
This
fails because the default precision is 2 and this answer requires 3
Ex: SELECT (DATE '1999-03-01' - DATE
'1899-01-01') YEAR(3) TO MONTH;
100-02
Ex: SELECT (DATE '1999-03-01' - DATE
'1899-01-01') MONTH(4);
1202
VIMP: Intervals should have the word
“INTERVAL” associated with them
Year-Month Interval Conversions and
Calculations
1.
You can CAST any of these types AS any of
these types:
CAST
|
YEAR
YEAR TO MONTH MONTH |
AS
|
YEAR
YEAR TO MONTH MONTH |
2. Within
the year-month category an interval may be recast as any other interval.
3. Mathematical
operations such as division and multiplication may be used with interval data
types to calculate fractional portions of intervals or to apply a factor or
multiple intervals to a date
Example:
Ex: SELECT CAST ((DATE'1999-03-01'-
DATE'1999-01-01') AS INTERVAL MONTH);
59
The
result is an integer CAST as months.
Ex: SELECT (DATE '1999-03-01' - DATE
'1999-01-01') MONTH;
2
The
result is an interval of months.
SELECT CAST ((INTERVAL '3-04' YEAR
TO MONTH) AS INTERVAL MONTH);
40
3
years+4 months = 40 months.
SELECT CAST ((INTERVAL '3-07' YEAR
TO MONTH) AS INTERVAL YEAR);
3
As
we are converting to interval YEAR, 7 months get truncated.
SELECT INTERVAL '10-02' YEAR TO MONTH/3;
Gives
3-04
10
years 2 months = 122 months
122
months/3 = 40.67 months
40.67 months rounds to 40 months
40 months = 3 years 4 months
40.67 months rounds to 40 months
40 months = 3 years 4 months
Extracting
From Date (EXTRACT function):
1.
Extracting of year, month and day from a
date data type has been a feature of Teradata since V2R2.
2. Now,
we may combine a date with an interval and extract the needed portion from the
result
3. Syntax:
EXTRACT YEAR/MONTH/DAY
from Date;
SELECT
EXTRACT (MONTH FROM (DATE '1999-12-15' + INTERVAL '20' DAY));
Ans
: 1
SELECT
EXTRACT (DAY FROM (DATE '1999-12-15'+ INTERVAL '20' DAY));
Ans:
4
ANSI time:
1.
TIME is a new data type. This came in to picture
since V2R3.
2. Prior
to this, keyword TIME was selectable and returned an integer representing the
time of day in format HHMMSS. This was not a data type and had no real clock
intelligence for purposes of calculations.
3. However
the TIME datatype has an intelligent clock in its implementation, just as DATE
has calendar intelligence.
4. It
is a single column which in reality carries three different fields of
information.
5. TIME
data type supports precision in seconds up to six places.
TIME(n)
- When n=0-6 (default is 6) HH:MM:SS.nnnnnn
HH - stored as byteint (1 byte)
MM - stored as byteint (1 byte)
SS - stored as dec(8,6)(4 bytes)
HH - stored as byteint (1 byte)
MM - stored as byteint (1 byte)
SS - stored as dec(8,6)(4 bytes)
6. Time
may be represented as a literal. As with dates, the character string must
conform properly to the TIME data type, and the exact degree of precision will
be determined by the parser as it scans the literal.
So
if we use the literal TIME ’22:32:12.970000’ will be determined to be a TIME(6)
data type.
7. Irrespective
of precision, TIME data type requires total 6 bytes of storage.
8. IF
we want to convert time data type to characters then the number of characters
needed depend upon the precision used:
TIME (0) - 11:37:58 CHAR(8)
TIME (6) - 11:37:58.213000 CHAR(15)
Time
subtraction:
1.
Time subtraction will produce a time
interval result as specified in the SQL statement.
2. If
a result is to be represented in hours, any minutes or seconds in the remainder
will be omitted, as no attempt at rounding takes place
3. With
dates when we do not specify there output interval type, output is a integer.
However with Time subtraction if no time interval type is specified for the
result, an error will be reported.
4. Time subtraction can result in output intervals
HOUR,HOUR TO MINUTE,HOUR TO SECOND,MINUTE,MINUTE TO SECOND,SECOND.
Ex: SELECT (TIME '10:35:40'- TIME
'08:00:00') HOUR;
Ans:
2
Ex: SELECT (TIME '10:35:40'- TIME
'08:00:00') MINUTE;
***Failure
7453 interval field overflow.
Ex: SELECT (TIME '10:35:40'-TIME
'08:00:00') MINUTE(3);
155
Ex: SELECT (TIME '23:59:59.99'-
CURRENT_TIME) HOUR;
6
Ex: SELECT (TIME '23:59:59.99'-
CURRENT_TIME) HOUR TO MINUTE;
6:24
Note
the use of brackets.
Simple DAY-TIME interval:
1.
Simple day-time intervals are those with
only one unit of measurement.'
2. Complex
data types have two or more units of measure.
3. All
simple day-time intervals (DAY, HOUR, MINUTE, SECOND) support up to four digits
for representing the unit, either plus or minus.
Additionally,
the SECOND interval may have up to six places of precision.
4. You
cannot convert Year/Month intervals to Day/Time intervals.
5.
Day-time
interval syntax:
INTERVAL
DAY(n) (-9999 to +9999 days)
INTERVAL HOUR(n) (-9999 to +9999 hours)
INTERVAL MINUTE(n) (-9999 to +9999 minutes)
INTERVAL SECOND(n,m) (9999.999999 seconds)
INTERVAL DAY(n)TO HOUR(n)
INTERVAL DAY(n) TO MINUTE(n)
INTERVAL DAY(n) TO SECOND(n,m)
INTERVAL HOUR(n) TO MINUTE(n)
INTERVAL HOUR(n) TO SECOND(n,m)
INTERVAL MINUTE(n) TO SECOND(n,m)
INTERVAL HOUR(n) (-9999 to +9999 hours)
INTERVAL MINUTE(n) (-9999 to +9999 minutes)
INTERVAL SECOND(n,m) (9999.999999 seconds)
INTERVAL DAY(n)TO HOUR(n)
INTERVAL DAY(n) TO MINUTE(n)
INTERVAL DAY(n) TO SECOND(n,m)
INTERVAL HOUR(n) TO MINUTE(n)
INTERVAL HOUR(n) TO SECOND(n,m)
INTERVAL MINUTE(n) TO SECOND(n,m)
Example:
INTERVAL
DAY(n) (-9999 to +9999 days, where n=1-4)
INTERVAL '320' DAY (320 days)
INTERVAL -'9' HOUR (-9 hours)
INTERVAL '700' MINUTE (700 minutes)
INTERVAL '1375.904508' SECOND (1375.904508 seconds)
INTERVAL '320' DAY (320 days)
INTERVAL -'9' HOUR (-9 hours)
INTERVAL '700' MINUTE (700 minutes)
INTERVAL '1375.904508' SECOND (1375.904508 seconds)
All
Day-time intervals are stored as SMALLINT with range (-9999 to 9999) and
seconds part have datatype of dec(8,6) with range -9999.999999 to 9999.999999.
Complex DAY-TIME interval:
Complex
day-time intervals are combinations of two or more simple day-time intervals.
Their representation as character strings is a bit more complex because of the
varieties of syntax possible. The parser will scan a complex day-time literal
to see if it conforms to the expected syntax, then assign a working interval
data type to it. Otherwise an error is generated.
INTERVAL
'25 09' DAY TO HOUR
INTERVAL -'9 13:36' DAY TO MINUTE
INTERVAL '25 13:36:15.5' DAY TO SECOND
INTERVAL '13:36' HOUR TO MINUTE
INTERVAL '13:36:15.5' HOUR TO SECOND
INTERVAL '36:15.5' MINUTE TO SECOND
INTERVAL -'9 13:36' DAY TO MINUTE
INTERVAL '25 13:36:15.5' DAY TO SECOND
INTERVAL '13:36' HOUR TO MINUTE
INTERVAL '13:36:15.5' HOUR TO SECOND
INTERVAL '36:15.5' MINUTE TO SECOND
Combining
Time intervals with Time literal.
1.
Time literals may be combined with time
intervals to produce a new time.
2.
The
resulting time will become the same time data type as the starting time,
regardless of the interval type.
If
changing the resulting time to a different time data type is desired, the
result must be CAST to the new time data type.
3. TIME
data type can be combined with HOUR/HOUR TO MINUTE/HOUT TO SECOND/MINUTE/MINUTE
TO SECOND/SECOND.( and not with DAY/MONTH/YEAR /YEAR TO MONTH)
Ex:
SELECT TIME '09:30:22' - INTERVAL '01:20:00' HOUR TO SECOND;
08:10:22
SELECT
TIME '09:30:22.45' - INTERVAL '01:20:10' HOUR TO SECOND;
08:10:12.45
(result
will have same time datatype. Ie precision 2)
SELECT
TIME '09:30:22' - INTERVAL '01:20:10.45' HOUR TO SECOND;
08:10:11
Result
datatype and precision does not depend upon the interval time.
SELECT
CAST((TIME '09:30:22' - INTERVAL '01:20:10.45' HOUR TO SECOND)AS TIME(2));
08:10:11.55
We
can cast if we want to change to a different time data type.
CASTING
Day-Time interval conversions and calculations:
Conversion
between different types of day-time interval types is easily accomplished using
the CAST feature of SQL.
Conversions
which include a remainder which is not supported by the conversion interval
type will be dropped, not rounded. Thus, converting 47 hours into days will
yield only one day.
Attention
must be paid to the appropriate number of digits specified in the conversion
interval type.
You
can CAST any of the values in the left column AS any of the values in the right
column.
CAST
|
DAY
DAY TO HOUR DAY TO MINUTE DAY TO SECOND HOUR HOUR TO MINUTE HOUR TO SECOND MINUTE MINUTE TO SECOND SECOND |
AS
|
DAY
DAY TO HOUR DAY TO MINUTE DAY TO SECOND HOUR HOUR TO MINUTE HOUR TO SECOND MINUTE MINUTE TO SECOND SECOND |
SELECT CAST ((INTERVAL '3:45' HOUR
TO MINUTE) AS INTERVAL HOUR);
Ans:
3
SELECT CAST ((INTERAL '3:45' HOUR TO
MINUTE) AS INTERVAL MINUTE);
Ans:
***Failure 7453 Interval field overflow.
SELECT CAST ((INTERVAL '3:45' HOUR
TO MINUTE) AS INTERVAL MINUTE(3));
Ans:
225
EXRACT
function for time:
The
number of hours, minutes or seconds may be extracted from a TIME data type by
using the EXTRACT feature of SQL. These units may be extracted either from a
time data type or from a calculation resulting in a time data type.
EXTRACT
(HOUR(MINUTE(SECOND FROM TIME)
No comments:
Post a Comment