Jay,
this looks good to me! The standard opens for a split-second precision
as well, but if noone can come up with a good use case, it's probably OK
to just forget about that.
Too bad we do not have 17-bit integers, by the way :)
Thanks,
Roy
Jay Pipes wrote:
OK, this actually gets back to my original (probably poorly worded)
question:
QUESTION: Is there a need for the current MySQL TIME behaviour of
allowing hours up to 838?
If we could make the TIME column type support seconds in the range of a
single day, life would be much easier.
So...
Can we do this?
The result would be the following:
TIME would still be stored in 3 bytes.
TIME would store seconds in the range 00:00:00 (midnight) to 23:59:59.
For those currently using the TIME column type to store *elapsed time*:
* If the range of elapsed time needing storage is > 00:00:00 - 23:59:59
(86400 seconds), then you would use an INTEGER type to store seconds.
* If the elapsed seconds will always be within the above range, continue
to use TIME.
Incoming formats of TIME would be limited to:
HH:MM:SS
H:MM:SS
MM:SS
M:SS
SS
S
And H would be enforced in the range 0-23, M and S would be enforced in
the range 0-59.
Note to Roy:
We won't need to store time in the range up to 61.999 seconds because we
do not support timezones.
So, all, please let me know what you think of the above proposal. It
would simplify the way we handle TIME columns internally and, I believe,
make the TIME column type simpler and more straight-forward to
understand for users.
Cheers,
Jay
Roy Lyseng wrote:
In standard SQL, TIME is limited to 23 hours, 61.999... seconds.
If you want to record a duration, there is an INTERVAL data type, or
actally there are two: DAY-TIME intervals and YEAR-MONTH intervals.
You can specify which components to include, the maximum range (in
number of years or days or whatever) and the precision (down to at
least microsecond).
Thanks,
Roy
Tim Soderstrom wrote:
On Dec 29, 2008, at 10:19 AM, Jay Pipes wrote:
Tim Soderstrom wrote:
On Dec 29, 2008, at 9:11 AM, Jay Pipes wrote:
From the MySQL Manual:
http://dev.mysql.com/doc/refman/5.0/en/time.html
"MySQL retrieves and displays TIME values in 'HH:MM:SS' format
(or 'HHH:MM:SS' format for large hours values). TIME values may
range from '-838:59:59' to '838:59:59'. The hours part may be so
large because the TIME type can be used not only to represent a
time of day (which must be less than 24 hours), but also elapsed
time or a time interval between two events (which may be much
greater than 24 hours, or even negative)."
Question:
Does anyone use the TIME column type?
Yes. I use it to store song lengths. I assume the same holds true
for people wanting to store videos, etc.
OK. So, basically, you are just using TIME as a presentation thing,
right? TIME outputs automatically as HH:MM:SS, and that is good for
your application?
Well, yes, I suppose I am. But in this case, I think it's warranted
because I'm only handling time (duration specifically). So, it is
presentation, but it's also a bit of consistency. I want to say "this
field only stores times. That's it. Not numbers. Times". To me,
consistency is part of what a modern SQL-based DB is for. This is as
convenient as having an IPv4 data-type. If you know it's always going
to be an IP, why not have the DB give it to you as an IP and throw an
error when it isn't? Same thing for the time type (or, again, more
specifically for me, duration). Yes, you can store it as a raw
integer, but you can do that with IPs now and look how well that
works :)
If we remove TIME, the people that now use it, would probably just
store it as a string (much like they do for IPs). Should Drizzle
cater to the lazy and uneducated? Perhaps not, but I lost count of
the times I've had to discuss INET_ATON and NTOA with a customer. I
can't imagine TIME_STON and TIME_NTOS :)
Now, to draw the line, I'd like to have a TIME type, but I don't
really think it would be the place of the DB to provide various
formats to display the time. Only one - namely HH:SS. If I want to
display that as "17 hours, 9 minutes" that is something that
application should do. Or at least something Drizzle shouldn't
provide as a core offering.
To be fair, if the TIME type can be made into a plugin I'd be happy
pulling it out of the core of Drizzle.
If so, do you use the "large hours" ability to store hours >
23:59:59?
I haven't, but this came up once. Someone wanted to track the total
length of time someone was logged in. And, in fact, it was thought
that he might need MORE than 839 hours :) I wouldn't really say
there's a huge need for this, however. Though, I would like to keep
the TIME field. For storing reasonable lengths (again songs), it's
wildly convenient.
What about storing the elapsed time in seconds in an integer column?
For that application, that's what he ended up doing. And that works -
the formatting is done in the application layer - presentation, in
other words. But, in an ideal world, it would have been nice to store
YY:DD:HH:SS and, if MySQL had it, I would have suggested he use it.
Again, it goes back to consistency. An integer is just an integer. It
doesn't mean anything, or rather it could mean anything.
TIME/DURATION - that at least describes what I'm storing and puts
constraints around it.
I'm looking to simplify the temporal column types and this is one
type I believe may possibly be up for the chopping block, but
certainly want to get people's opinion on it.
Well, since Drizzle is going to be pluggable, is this something
that can be a plugin and simply be built from native storage types?
Like human-readable IPv4 addresses, the underlying storage could
just be an integer. When you store or call it, you could just
automatically run a function to present it in a friendly way? That
may be already what you are doing with the TIME field and I can't
claim to be an expert but thought I'd throw that out there :)
Possibly. Right now, I'm just trying to simplify both the internal
implementation of TIME and the external "weirdness" of the 838 hours
thing...
Well, I also noticed it consumes 3 bytes ala MEDIUMINT, which I know
was axed. Perhaps you can, instead of using a TIME type, use DURATION
and store only positive numbers, even in a smaller range. *shrug*
I've only used TIME for duration, so I can't really speak to its
other uses.
Tim S.
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp
_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help : https://help.launchpad.net/ListHelp