TIMESTAMP values are converted
from the current time zone to UTC for storage, and converted
back from UTC to the current time zone for retrieval. (This
occurs only for the TIMESTAMP
data type, not for other types such as
DATETIME.)
The TIMESTAMP data type
provides a type that you can use to automatically mark
INSERT or
UPDATE operations with the
current date and time. If you have multiple
TIMESTAMP columns in a table,
only the first one is updated automatically. (From MySQL 4.1.2
on, you can specify which
TIMESTAMP column updates; see
Section 10.3.1.2, “TIMESTAMP Properties as of MySQL 4.1”.)
Automatic updating of the first
TIMESTAMP column in a table
occurs under any of the following conditions:
You explicitly set the column to NULL.
The column is not specified explicitly in an
INSERT or
LOAD DATA
INFILE statement.
The column is not specified explicitly in an
UPDATE statement and some
other column changes value. An
UPDATE that sets a column
to the value it does not cause the
TIMESTAMP column to be
updated; if you set a column to its current value, MySQL
ignores the update for efficiency.
A TIMESTAMP column other than
the first also can be assigned the current date and time by
setting it to NULL or to any function that
produces the current date and time
(NOW(),
CURRENT_TIMESTAMP).
Note that the information in the following discussion applies
to TIMESTAMP columns only for
tables not created with
MAXDB mode enabled, because
such columns are created as
DATETIME columns.
You can set any TIMESTAMP
column to a value different from the current date and time by
setting it explicitly to the desired value. This is true even
for the first TIMESTAMP column.
You can use this property if, for example, you want a
TIMESTAMP to be set to the
current date and time when you create a row, but not to be
changed whenever the row is updated later:
Let MySQL set the column when the row is created. This initializes it to the current date and time.
When you perform subsequent updates to other columns in
the row, set the TIMESTAMP
column explicitly to its current value:
UPDATEtbl_nameSETtimestamp_col=timestamp_col,other_col1=new_value1,other_col2=new_value2, ...
Another way to maintain a column that records row-creation
time is to use a DATETIME
column that you initialize to
NOW() when the row is created
and do not modify for subsequent updates.
TIMESTAMP values may range from
the beginning of 1970 to partway through the year 2038, with a
resolution of one second. Values are displayed as numbers.
When you store a value in a
TIMESTAMP column, it is assumed
to be represented in the current time zone, and is converted
to UTC for storage. When you retrieve the value, it is
converted from UTC back to the local time zone for display.
Before MySQL 4.1.3, the server has a single time zone. As of
4.1.3, clients can set their own time zones on a
per-connection basis, as described in
Section 9.7, “MySQL Server Time Zone Support”.
Prior to version 4.1, the format in which MySQL retrieves and
displays TIMESTAMP values
depends on the display size, as illustrated in the following
table. The “full”
TIMESTAMP format is 14 digits,
but TIMESTAMP columns may be
created with shorter display sizes.
| Data Type | Display Format |
TIMESTAMP(14) |
YYYYMMDDHHMMSS |
TIMESTAMP(12) |
YYMMDDHHMMSS |
TIMESTAMP(10) |
YYMMDDHHMM |
TIMESTAMP(8) |
YYYYMMDD |
TIMESTAMP(6) |
YYMMDD |
TIMESTAMP(4) |
YYMM |
TIMESTAMP(2) |
YY |
All TIMESTAMP columns have the
same storage size, regardless of display size. The most common
display sizes are 6, 8, 12, and 14. You can specify an
arbitrary display size at table creation time, but values of 0
or greater than 14 are coerced to 14. Odd-valued sizes in the
range from 1 to 13 are coerced to the next higher even number.
TIMESTAMP columns store legal
values using the full precision with which the value was
specified, regardless of the display size. This has several
implications:
Always specify year, month, and day, even if your column
types are TIMESTAMP(4) or
TIMESTAMP(2). Otherwise, the value is
not a legal date and 0 is stored.
If you use ALTER TABLE to
widen a narrow TIMESTAMP
column, information is displayed that previously was
“hidden.”
Similarly, narrowing a
TIMESTAMP column does not
cause information to be lost, except in the sense that
less information is shown when the values are displayed.
If you are planning to use mysqldump
for the database, do not use
TIMESTAMP(4) or
TIMESTAMP(2). The display format for
these data types are not legal dates and
0 will be stored instead. This
inconsistency is fixed starting with MySQL 4.1, where
display width is ignored. To prepare for transition to
versions after 4.0, you should change to use display
widths of 6 or more, which will produce a legal display
format. You can change the display width of
TIMESTAMP data types,
without losing any information, by using
ALTER TABLE as indicated
above.
If you need to print the timestamps for external
applications, you can use
MID() to extract the
relevant part of the timestamp: for example, to imitate
the TIMESTAMP(4) display format.
Although TIMESTAMP values
are stored to full precision, the only function that
operates directly on the underlying stored value is
UNIX_TIMESTAMP(). Other
functions operate on the formatted retrieved value. This
means you cannot use a function such as
HOUR() or
SECOND() unless the
relevant part of the
TIMESTAMP value is included
in the formatted value. For example, the
HH part of a
TIMESTAMP column is not
displayed unless the display size is at least 10, so
trying to use HOUR() on
shorter TIMESTAMP values
produces a meaningless result.
In MySQL 4.1, TIMESTAMP display
format changes to be the same as
DATETIME, that is, as a string
in 'YYYY-MM-DD HH:MM:SS' format rather than
as a number in YYYYMMDDHHMMSS format. To
test applications written for MySQL 4.0 for compatibility with
this change, you can set the
new system variable to 1.
This variable is available beginning with MySQL 4.0.12. It can
be set at server startup by specifying the
--new option to mysqld. At
runtime, a user who has the
SUPER privilege can set the
global value with a
SET
statement:
mysql> SET GLOBAL new = 1;
Any client can set its session value of
new as follows:
mysql> SET new = 1;
The general effect of setting
new to 1 is that values for
existing TIMESTAMP columns
display as strings rather than as numbers. Also,
DESCRIBE displays the column
definition as TIMESTAMP(19),
rather than as TIMESTAMP(14).
The effect differs somewhat for
TIMESTAMP columns that are
created while new is set to
1. In this case, column values display as strings and
DESCRIBE shows the definition
as TIMESTAMP(19), regardless of
the current value of new.
In other words, with new=1, all
TIMESTAMP values display as
strings and DESCRIBE shows a
display width of 19. For columns created while
new=1, they continue to display as strings
and to have a display width of 19 even if
new is set to 0.
For a TIMESTAMP column that
displays as a string, you can display it as a number by
retrieving it as
.
col_name+0

User Comments
If comparing a truncated timestamp to a full timestamp, it seems only the truncated portion is matched against. For example;
1 row in set (0.00 sec)mysql> CREATE TEMPORARY TABLE tmptbl (ID INT, time TIMESTAMP(8));
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO tmptbl (ID,time) VALUES ('15','20050111094301');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM tmptbl WHERE time='20050111102500';
Using version 4.0.20-max-log
Add your own comment.