| Developing Time-Oriented Applications in SQL | Richard T. Snodgrass |
This document outlines temporal data type support for the UniSQL DBMS. It follows the general outline of the TDB book and is arranged in the following manner.
Similar to SQL-92, UniSQL supports the DATE, TIME, and TIMESTAMP data types, however expresses them differently. For example, it uses DATE '01/01/1997' to express DATE '1997-01-01'. TIMESTAMPs are constrained to a granularity of a second. Their range is only January 1, 1970 through 03:14:07 January 19, 2038. TIMEs are also to a granularity of a second. In addition, substracting two DATEs yields an integral number of days; substracting two TIME or TIMESTAMP values will yield an integral number of second. Some other operations in SQL-92 such as TIME WITH TIME ZONE are not supported in UniSQL.
| SQL-92 |
UniSQL Equivalent
|
| Types: | |
| DATE | DATE, must fall between 0 and 9999 AD, constrained by Gregorian calendar |
| TIME | TIME (to second granularity) |
| TIMESTAMP | TIMESTAMP (to second granularity), range from 00:00:00 January 1, 1970 through 03:14:07 January 19, 2038 GMT |
| TIME WITH TIME ZONE | No equivalent |
| TIMESTAMP WITH TIME ZONE | No equivalent |
| INTERVAL YEAR TO MONTH | No equivalent |
| INTERVAL DAY TO SECOND | No equivalent (substracting two DATEs yields an integral number of days; substracting two TIME or TIMESATMP values will yield an integral number of seconds) |
| Literals: | |
| DATE '1997-01-01' | DATE '01/01/1997', 'mm/dd[/yyyy]' |
| TIME '12:34:56' | TIME '12:34:56', 'hh:mm[:ss][am/pm]' |
| TIMESTAMP '1997-01-01 12:34:56' | TIMESTAMP '01/01/1997 12:34:56', 'mm/dd[/yyyy] hh:mm[:ss][am/pm]' |
| INTERVAL '3-4' YEAR TO MONTH | Not possible |
| INTERVAL '1 23:45:12' DAY TO SECOND | 'TIME-TIME=171812 (seconds)' |
| Predicates: | |
| d1 = d2 | d1 = d2 |
| d1 < d2 | d1 < d2 |
| d1 <> d2 | d1 <> d2 |
| d1 BETWEEN d2 AND d3 | d1 BETWEEN d2 AND d3 |
| i1 = i2 | j1 = j2 |
| i1 < i2 | j1 < j2 |
| i1 <> i2 | j1 <> j2 |
| i1 BETWEEN i2 AND i3 | j1 BETWEEN j2 AND j3 |
| d IS NULL | d IS NULL |
| i IS NULL | j IS NULL |
| (d1, i2) OVERLAPS (d3, d4) | d1 <= d4 AND d3 <= (d1 + j2) |
| Datetime Constructors: | |
| d + i | d + j |
| i + d | j + d |
| d - i | d - j |
| d AT i | Not supported |
| d AT LOCAL | Not supported |
| CURRENT_DATE | Not supported |
| CURRENT_TIME | Not supported |
| CURRENT_TIMESTAMP | Not supported |
| Internal Constructors: | |
| i1 + i2 | j1 + j2 |
| i1 - i2 | j1 - j2 |
| d1 - d2 qual | d1 - d2 (substracting two DATEs yields an integral number of days) |
| d1 - d2 INTERVAL MONTH | Not possible |
| i * n | j * n |
| n * i | n * j |
| i / i | j / j |
| + i | + j |
| - i | - j |
| Other Operators: | |
| CAST(d AS DATE) | CAST(d AS DATE) |
| CAST(d AS TIME) | CAST(d AS TIME) (where d is a TIME) |
| CAST(d AS TIMESTAMP) (where d is a DATE) | CAST(d AS TIMESTAMP) (where d is a DATE) |
| CAST(d AS TIMESTAMP) (where d is a TIME) | CAST(d AS TIMESTAMP) (where d is a TIME) |
| CAST(i AS INTERVAL YEAR TO MONTH) | Not possible |
| CAST(i AS INTERVAL DAY TO SECOND) | j |
| CAST(d AS CHAR) | CAST(d AS CHAR) |
| CAST(i AS CHAR) | CAST(i AS CHAR) |
| CAST(i AS INTEGER) (where i is a DAY) | j (already an integer) |
| CAST(i AS INTEGER) (where i is a SECOND) | i already an integer |
| EXTRACT(DAY from d) | EXTRACT(DAY from d) |
| EXTRACT(DAY from i) | Not possible |
| EXTRACT(HOUR from i) | Not possible |
| Operators not in SQL-92: | |
| Convert d to Julian day | Not supported |
| Convert Julian day n to DATE | Not supported |
| Pick the earliest date | Not supported |
| Pick the latest date | Not supported |
| Pick the last day of the month | Not supported |
| Get the next day of the week | Not supported |
Name
STRINGBirthdate
DATEProject_time
TIMECheckin_time
TIMESTAMPCheckout_time
TIMESTAMP
| SQL-92 |
UniSQL Equivalent
|
| Types: | |
| period | No corresponding type, can be considered as two dates [DATE, DATE) |
| Predicates: | |
| p equals q | p1 = q1 AND p2 = q2 |
| p before q | p2 < q1 |
| p before-1 q | q2 < p1 |
| p meets q | p2 = q1 |
| p meets-1 q | q2 = p1 |
| p overlaps q | p1 < q1 AND q1 < p2 |
| p overlaps-1 q | q1 < p1 AND p1 < q2 |
| p during q | q1 < p1 AND p2 < q2 |
| p during-1 q | p1 < q1 AND q2 < p2 |
| p starts q | p1 = q1 AND p2 < q2 |
| p starts-1 q | p1 = q1 AND q2 < p2 |
| p finishes q | q1 < p1 AND p2 = q2 |
| p finishes-1 q | p1 < q1 AND p2 = q2 |
| p OVERLAPS q | p1 < q2 AND q1 < p2 |
| p IS NULL | p1 IS NULL |
| Datetime Constructors: | |
| beginning(p) | p1 |
| previous(p) | p1-1 |
| last(p) | p2-1(for closed-open representation p=[p1, p2)); p2 (for closed-closed representation) |
| ending(p) | p2 |
| Interval Constructors: | |
| duration(p) | p2-p1 |
| extract_time_zone(p) | Not supported |
| Period Constructors: | |
| p + i | [p1 + j, p2 + j) |
| i + p | [p1 + j, p2 + j) |
| p - i | [p1 - j, p2 - j) |
| a extend b | Not possible |
| p extend q | Not possible |
| p extend a | Not possible |
| a extend p | Not possible |
| p INTERSECT q | Not possible |
| p - q | Not possible |
| p UNION q | Not possible |
| p AT TIME ZONE i | Not supported |
| p AT LOCAL | Not supported |
| Other Operators: | |
| CAST(a AS PERIOD) | [a, a+1) |
| CAST(p AS CHAR) | Not possible |
Name
STRINGBirthdate
DATEProject_time
TIMECheckin_time
TIMESTAMPCheckout_time
TIMESTAMP
Qing Yan, University of Arizona (qyan@lectura.cs.arizona.edu)
Rachana R. Shah, University of Arizona (rachana@lectura.cs.arizona.edu)
Jian Yang,Department of Computer Science, University of
Arizona (yangjian@cs.arizona.edu)
November 10, 1998 (Last Update)
Qing Yan, University of Arizona (qyan@lectura.cs.arizona.edu)
November 30, 1997 (Last Update)