I don’t think 4713 BC comes from the SQL standard. That is a Postgres thing.

I believe that the standard says you should support timestamp precision up to 9 
(i.e. nanoseconds). 2 ^ 64 nanoseconds is 584 years. So, it’s not possible to 
cram all of the timestamp values we’d like into a 64 bit integer if you are 
going to support such a large time range.

Julian
 
> On Mar 14, 2017, at 11:29 AM, Boaz Ben-Zvi <bben-...@mapr.com> wrote:
> 
> Thanks for the detailed research, Paul,
> 
>  INTERVAL by the (SQL-99 ?) standard should be either a SECOND-DAY interval 
> or a MONTH-YEAR interval. This is a result of the inconsistent “number of 
> days in a month”.
> 
> DATE expressed in days, starting at 4713-BC sound like the standard as well 
> (at least same as Postgres). (should be implemented as 4 byte)
> 
> TIME is only within a 24 hour period, so why should it care about 2001 ?  
> Probably the documentation should be fixed. (should be implemented as 4 byte)
> 
> TIMESTAMP should be an 8 byte type (maybe starting at 4713-BC as well, to 
> match DATE (and Postgres :-)).
> 
>    Thanks,
> 
>           — Boaz
> 
> 
> On Mar 13, 2017, at 3:46 PM, Paul Rogers 
> <prog...@mapr.com<mailto:prog...@mapr.com>> wrote:
> 
> Thanks Parth!
> 
> The date and time definitions are the “classic” ones, but conflict with the 
> Drill documentation:
> 
> http://drill.apache.org/docs/supported-data-types/
> 
> DATE Years, months, and days in YYYY-MM-DD format since 4713 BC
> 
> TIME 24-hour based time before or after January 1, 2001 in hours, minutes, 
> seconds format: HH:mm:ss
> 
> Which is correct?
> 
> If the documentation is wrong, we can file a JIRA to correct it. (It may not 
> even be wrong, since one can convert from one to the other easily, it may 
> just be misleading…)
> 
> Also note that, according to C++, DATE and TIME and TIMESTAMP are exactly the 
> same, but the TIME as as 32-bit number, could only hold about 2 years due to 
> limited range.
> 
> Also, according to SQL, DATE has no time zone, it is just a date. That is, 
> 2016-03-13 is the same date in PST or GMT. If DATE were seconds since the UTC 
> epoch, dates would be different in different time zones. So, I assume we use 
> the Unix epoch, but without an implied UTC time zone as is usual for Linux 
> and Windows timestamps?
> 
> How does a TIMESTAMP differ from a DATE? Perhaps a TIMESTAMP is based on the 
> epoch UTC while DATE has no implied time zone?
> 
> Again, the documentation differs:
> 
> INTERVAL (Internally, INTERVAL is represented as INTERVALDAY or 
> INTERVALYEAR.) A day-time or year-month interval
> 
> TIMESTAMP JDBC timestamp in year, month, date hour, minute, second, and 
> optional milliseconds format: yyyy-MM-dd HH:mm:ss.SSS
> 
> So, sounds like we have an INTERVALDAY and INTERVAL year, but do we or do we 
> not have an INTERVAL?
> 
> If anyone knows, please let me know, else I need to do some poking around...
> 
> Thanks,
> 
> - Paul
> 
> On Mar 13, 2017, at 2:44 PM, Parth Chandra 
> <par...@apache.org<mailto:par...@apache.org>> wrote:
> 
> Paul asked this and I'm posting here so someone who knows better can
> correct me if I'm wrong ( This is from my notes when I was young)
> 
> DATE : Int64 : Milliseconds from Unix Epoch : 1/1/1970 00:00:00
> TIME : Int32 : Milliseconds from midnight on 1/1/1970
> TimeStampTZ : Int64 + Int32 : (Milliseconds from epoch + Index into list of
> TimeZones)
> TimeStamp : Int64 : Milliseconds from epoch
> Interval : Int32 + Int32 + Int32 : Month + Days + Milliseconds
> Interval Day : Int32 + Int32 : Days + Milliseconds
> Interval Year : Int32 : Month
> 
> A slightly readable version of these can be found in the C++ client :).
> $drill_src/contrib/native/client/src/include/drill/recordbatch.hpp which
> has a bunch of 'Holder' structs for the date-time types.
> 
> HTH
> 
> Parth
> 
> 

Reply via email to