Stormblade (and anyone watching this thread),

Just watch yourself when deciding between DATETIME and TIMESTAMP; the two
datatypes support very different ranges of values!

According to the manual, DATETIME can store any value between '1000-01-01
00:00:00' and '9999-12-31 23:59:59' but TIMESTAMP can only handle the range
'1970-01-01 00:00:00 ' and "sometime in the year 2037".

Therefore, even if you really want to use TIMESTAMP but you have to store a
timestamp earlier than 1970 or after 2037, you're going to be out of luck.
Be sure you think about what values you'll have to store before you make a
final choice of the datatype.

Rhino

----- Original Message ----- 
From: "Stormblade" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, April 18, 2004 1:30 PM
Subject: Re: Datetime Default Value


> On Sun, 18 Apr 2004 12:17:00 -0400, Michael Stassen wrote:
>
> > Stormblade wrote:
> >
> >> Hey all,
> >>
> >> I'm currently converting a SQLServer 2000 database over to MySQL. I
have a
> >> web application that currently uses SQLServer but will be using MySQL
soon
> >> as I can get this done.
> >>
> >> I was able to match data types but so far I have not found a way to let
the
> >> database handle setting the default value of a datetime field to the
> >> current date/time. Is this possible?
> >
> > Defaults must be constants, not functions, in MySQL.  So, except for the
> > TIMESTAMP type, the answer is no.
>
> I suspected as much. I wonder if they plan to add this in the future or if
> there is some technical reason that they did not allow for this.
>
> >
> >> In my research I found 2 main suggestions:
> >>
> >> 1. Use timestamp. While this suggestion is good for my modified fields
it
> >> is not really suitable for the others which basically will get set once
and
> >> that's it.
> >
> > You can preserve the value of a timestamp column by explicitly setting
it to
> > itself in an UPDATE.  Something like this:
> >
> >    UPDATE yourtable SET somecol='newvalue', timestampcol=timestampcol
> >    WHERE ...
> >
>
> Yea I saw that but then I'd have to guarantee that any SQL that updated
did
> this. I had visions of lots of pain in this case. It would only take a
> single mistake to permanently remove the creation date.
>
> >> 2. Use datetime but specify the date/time in your SQL. This is also not
> >> very suitable for two reasons. One is that it would require me to go
> >> through the web application and change all the SQL which I can do but
> >> rather not. The second reason is that this approach is dangerous. There
is
> >> no guarantee that the database is on the same system as the web
> >> application. May not even be in the same timezone. So I prefer a more
> >> loosely coupled design.
> >
> > This need not be dangerous.  You can use the CURDATE() and NOW()
functions
> > to let the server define the date and time.  Something like this:
> >
> >    INSERT INTO yourtable (datecol, datetimecol, othercols...)
> >    VALUES (CURDATE(), NOW(), othervals...);
> >
> > See <http://dev.mysql.com/doc/mysql/en/Date_and_time_functions.html> for
more.
>
> Ok, I knew about the functions but what do you mean allow the server to to
> define the date/time. If I use an SQL like you have above does the
database
> itself resolve those function then? If so then that's a good alternative.
> Sure I'll have to modify some SQL but I can set the date field not to
allow
> null so that when they create a record they HAVE to supply a date.
>
> Now on updates if I remember my SQL I don't have to specify the date and
> it'll just leave it alone. So that means rather than changing all the SQL
I
> only really have to modify the Inserts.
>
> >
> >> If I can't find any other way I will have to go with the second option
but
> >> I'd really like to find out a better way if one exists.
> >
> > So, you have two choices: Use timestamp and change your code to preserve
the
> > timestamp in updates, or use datetime and change your code to set it to
> > NOW() on insert.  Depending on your application, one of those may be
easier
> > to do (require fewer changes).  All else being equal, I'd recommend
using
> > datetime, as it is intuitively closer to what you want
(self-documenting).
>
> Yup that's what I think I will do. I will use timestamp only for when I
> need a last modified type value and datetime for all else.
>
> >
> > Michael
>
> Thanks much. If the curdate and now functions use the system date
according
> to where the MySQL database is then that's the solution for me.
> -- 
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
> Stormblade (Shaolin Code Warrior)
> Software Developer (15+ Years Programming exp.)
>
> My System: http://www.anandtech.com/mysystemrig.html?rigid=1683
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
>
>
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>
>


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to