The date and time types for representing temporal values are
      DATETIME, DATE,
      TIMESTAMP, TIME, and
      YEAR. Each temporal type has a range of legal
      values, as well as a “zero” value that may be used
      when you specify an illegal value that MySQL cannot represent. The
      TIMESTAMP type has special automatic updating
      behavior, described later on. For temporary type storage
      requirements, see Section 11.5, “Data Type Storage Requirements”.
    
      Starting from MySQL 5.0.2, MySQL gives warnings or errors if you
      try to insert an illegal date. By setting the SQL mode to the
      appropriate value, you can specify more exactly what kind of dates
      you want MySQL to support. (See
      Section 5.2.5, “The Server SQL Mode”.) You can get MySQL to accept
      certain dates, such as '1999-11-31', by using
      the ALLOW_INVALID_DATES SQL mode. (Before
      5.0.2, this mode was the default behavior for MySQL.) This is
      useful when you want to store a “possibly wrong”
      value which the user has specified (for example, in a web form) in
      the database for future processing. Under this mode, MySQL
      verifies only that the month is in the range from 0 to 12 and that
      the day is in the range from 0 to 31. These ranges are defined to
      include zero because MySQL allows you to store dates where the day
      or month and day are zero in a DATE or
      DATETIME column. This is extremely useful for
      applications that need to store a birthdate for which you do not
      know the exact date. In this case, you simply store the date as
      '1999-00-00' or
      '1999-01-00'. If you store dates such as these,
      you should not expect to get correct results for functions such as
      DATE_SUB() or DATE_ADD that
      require complete dates. (If you do not want
      to allow zero in dates, you can use the
      NO_ZERO_IN_DATE SQL mode).
    
      MySQL also allows you to store '0000-00-00' as
      a “dummy date” (if you are not using the
      NO_ZERO_DATE SQL mode). This is in some cases
      is more convenient (and uses less space in data and index) than
      using NULL values.
    
Here are some general considerations to keep in mind when working with date and time types:
MySQL retrieves values for a given date or time type in a standard output format, but it attempts to interpret a variety of formats for input values that you supply (for example, when you specify a value to be assigned to or compared to a date or time type). Only the formats described in the following sections are supported. It is expected that you supply legal values. Unpredictable results may occur if you use values in other formats.
Dates containing two-digit year values are ambiguous because the century is unknown. MySQL interprets two-digit year values using the following rules:
              Year values in the range 70-99 are
              converted to 1970-1999.
            
              Year values in the range 00-69 are
              converted to 2000-2069.
            
          Although MySQL tries to interpret values in several formats,
          dates always must be given in year-month-day order (for
          example, '98-09-04'), rather than in the
          month-day-year or day-month-year orders commonly used
          elsewhere (for example, '09-04-98',
          '04-09-98').
        
MySQL automatically converts a date or time type value to a number if the value is used in a numeric context and vice versa.
          By default, when MySQL encounters a value for a date or time
          type that is out of range or otherwise illegal for the type
          (as described at the beginning of this section), it converts
          the value to the “zero” value for that type. The
          exception is that out-of-range TIME values
          are clipped to the appropriate endpoint of the
          TIME range.
        
          The following table shows the format of the
          “zero” value for each type. Note that the use of
          these values produces warnings if the
          NO_ZERO_DATE SQL mode is enabled.
        
| Data Type | “Zero” Value | 
| DATETIME | '0000-00-00 00:00:00' | 
| DATE | '0000-00-00' | 
| TIMESTAMP | '0000-00-00 00:00:00' | 
| TIME | '00:00:00' | 
| YEAR | 0000 | 
          The “zero” values are special, but you can store
          or refer to them explicitly using the values shown in the
          table. You can also do this using the values
          '0' or 0, which are
          easier to write.
        
          “Zero” date or time values used through MyODBC
          are converted automatically to NULL in
          MyODBC 2.50.12 and above, because ODBC cannot handle such
          values.
        
        The DATETIME, DATE, and
        TIMESTAMP types are related. This section
        describes their characteristics, how they are similar, and how
        they differ.
      
        The DATETIME type is used when you need
        values that contain both date and time information. MySQL
        retrieves and displays DATETIME values in
        'YYYY-MM-DD HH:MM:SS' format. The supported
        range is '1000-01-01 00:00:00' to
        '9999-12-31 23:59:59'.
      
        The DATE type is used when you need only a
        date value, without a time part. MySQL retrieves and displays
        DATE values in
        'YYYY-MM-DD' format. The supported range is
        '1000-01-01' to
        '9999-12-31'.
      
        For the DATETIME and DATE
        range descriptions, “supported” means that although
        earlier values might work, there is no guarantee.
      
        The TIMESTAMP data type has varying
        properties, depending on the MySQL version and the SQL mode the
        server is running in. These properties are described later in
        this section.
      
        You can specify DATETIME,
        DATE, and TIMESTAMP values
        using any of a common set of formats:
      
            As a string in either 'YYYY-MM-DD
            HH:MM:SS' or 'YY-MM-DD
            HH:MM:SS' format. A “relaxed” syntax
            is allowed: Any punctuation character may be used as the
            delimiter between date parts or time parts. For example,
            '98-12-31 11:30:45', '98.12.31
            11+30+45', '98/12/31 11*30*45',
            and '98@12@31 11^30^45' are equivalent.
          
            As a string in either 'YYYY-MM-DD' or
            'YY-MM-DD' format. A
            “relaxed” syntax is allowed here, too. For
            example, '98-12-31',
            '98.12.31',
            '98/12/31', and
            '98@12@31' are equivalent.
          
            As a string with no delimiters in either
            'YYYYMMDDHHMMSS' or
            'YYMMDDHHMMSS' format, provided that the
            string makes sense as a date. For example,
            '19970523091528' and
            '970523091528' are interpreted as
            '1997-05-23 09:15:28', but
            '971122129015' is illegal (it has a
            nonsensical minute part) and becomes '0000-00-00
            00:00:00'.
          
            As a string with no delimiters in either
            'YYYYMMDD' or 'YYMMDD'
            format, provided that the string makes sense as a date. For
            example, '19970523' and
            '970523' are interpreted as
            '1997-05-23', but
            '971332' is illegal (it has nonsensical
            month and day parts) and becomes
            '0000-00-00'.
          
            As a number in either YYYYMMDDHHMMSS or
            YYMMDDHHMMSS format, provided that the
            number makes sense as a date. For example,
            19830905132800 and
            830905132800 are interpreted as
            '1983-09-05 13:28:00'.
          
            As a number in either YYYYMMDD or
            YYMMDD format, provided that the number
            makes sense as a date. For example,
            19830905 and 830905
            are interpreted as '1983-09-05'.
          
            As the result of a function that returns a value that is
            acceptable in a DATETIME,
            DATE, or TIMESTAMP
            context, such as NOW() or
            CURRENT_DATE.
          
        Illegal DATETIME, DATE, or
        TIMESTAMP values are converted to the
        “zero” value of the appropriate type
        ('0000-00-00 00:00:00' or
        '0000-00-00').
      
        For values specified as strings that include date part
        delimiters, it is not necessary to specify two digits for month
        or day values that are less than 10.
        '1979-6-9' is the same as
        '1979-06-09'. Similarly, for values specified
        as strings that include time part delimiters, it is not
        necessary to specify two digits for hour, minute, or second
        values that are less than 10.
        '1979-10-30 1:2:3' is the same as
        '1979-10-30 01:02:03'.
      
        Values specified as numbers should be 6, 8, 12, or 14 digits
        long. If a number is 8 or 14 digits long, it is assumed to be in
        YYYYMMDD or YYYYMMDDHHMMSS
        format and that the year is given by the first 4 digits. If the
        number is 6 or 12 digits long, it is assumed to be in
        YYMMDD or YYMMDDHHMMSS
        format and that the year is given by the first 2 digits. Numbers
        that are not one of these lengths are interpreted as though
        padded with leading zeros to the closest length.
      
        Values specified as non-delimited strings are interpreted using
        their length as given. If the string is 8 or 14 characters long,
        the year is assumed to be given by the first 4 characters.
        Otherwise, the year is assumed to be given by the first 2
        characters. The string is interpreted from left to right to find
        year, month, day, hour, minute, and second values, for as many
        parts as are present in the string. This means you should not
        use strings that have fewer than 6 characters. For example, if
        you specify '9903', thinking that represents
        March, 1999, MySQL inserts a “zero” date value into
        your table. This occurs because the year and month values are
        99 and 03, but the day
        part is completely missing, so the value is not a legal date.
        However, you can explicitly specify a value of zero to represent
        missing month or day parts. For example, you can use
        '990300' to insert the value
        '1999-03-00'.
      
You can to some extent assign values of one date type to an object of a different date type. However, there may be some alteration of the value or loss of information:
            If you assign a DATE value to a
            DATETIME or TIMESTAMP
            object, the time part of the resulting value is set to
            '00:00:00' because the
            DATE value contains no time information.
          
            If you assign a DATETIME or
            TIMESTAMP value to a
            DATE object, the time part of the
            resulting value is deleted because the
            DATE type stores no time information.
          
            Remember that although DATETIME,
            DATE, and TIMESTAMP
            values all can be specified using the same set of formats,
            the types do not all have the same range of values. For
            example, TIMESTAMP values cannot be
            earlier than 1970 or later than
            2037. This means that a date such as
            '1968-01-01', while legal as a
            DATETIME or DATE
            value, is not valid as a TIMESTAMP value
            and is converted to 0.
          
Be aware of certain pitfalls when specifying date values:
            The relaxed format allowed for values specified as strings
            can be deceiving. For example, a value such as
            '10:11:12' might look like a time value
            because of the ‘:’ delimiter,
            but if used in a date context is interpreted as the year
            '2010-11-12'. The value
            '10:45:15' is converted to
            '0000-00-00' because
            '45' is not a legal month.
          
            As of 5.0.2, the server requires that month and day values
            be legal, and not merely in the range 1 to 12 and 1 to 31,
            respectively. With strict mode disabled, invalid dates such
            as '2004-04-31' are converted to
            '0000-00-00' and a warning is generated.
            With strict mode enabled, invalid dates generate an error.
            To allow such dates, enable
            ALLOW_INVALID_DATES. See
            Section 5.2.5, “The Server SQL Mode”, for more information.
          
            Before MySQL 5.0.2, the MySQL server performs only basic
            checking on the validity of a date: The ranges for year,
            month, and day are 1000 to 9999, 00 to 12, and 00 to 31,
            respectively. Any date containing parts not within these
            ranges is subject to conversion to
            '0000-00-00'. Please note that this still
            allows you to store invalid dates such as
            '2002-04-31'. To ensure that a date is
            valid, you should perform a check in your application.
          
Dates containing two-digit year values are ambiguous because the century is unknown. MySQL interprets two-digit year values using the following rules:
                Year values in the range 00-69 are
                converted to 2000-2069.
              
                Year values in the range 70-99 are
                converted to 1970-1999.
              
          Note: In older versions of
          MySQL (prior to 4.1), the properties of the
          TIMESTAMP data type differed significantly
          in many ways from what is described in this section. If you
          need to convert older TIMESTAMP data to
          work with MySQL 5.0, be sure to see the
          MySQL 3.23, 4.0, 4.1 Reference Manual for details.
        
          TIMESTAMP columns are displayed in the same
          format as DATETIME columns. In other words,
          the display width is fixed at 19 characters, and the format is
          YYYY-MM-DD HH:MM:SS.
        
          The MySQL server can be also be run with the
          MAXDB SQL mode enabled. When the server
          runs with this mode enabled, TIMESTAMP is
          identical with DATETIME. That is, if this
          mode is enabled at the time that a table is created,
          TIMESTAMP columns are created as
          DATETIME columns. As a result, such columns
          use DATETIME display format, have the same
          range of values, and there is no automatic initialization or
          updating to the current date and time.
        
          To enable MAXDB mode, set the server SQL
          mode to MAXDB at startup using the
          --sql-mode=MAXDB server option or by setting
          the global sql_mode variable at runtime:
        
mysql> SET GLOBAL sql_mode=MAXDB;
          A client can cause the server to run in
          MAXDB mode for its own connection as
          follows:
        
mysql> SET SESSION sql_mode=MAXDB;
          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.
        
          As of MySQL 5.0.2, MySQL does not accept timestamp values that
          include a zero in the day or month column or values that are
          not a valid date. The sole exception to this rule is the
          special value '0000-00-00 00:00:00'.
        
          You have considerable flexibility in determining when
          automatic TIMESTAMP initialization and
          updating occur and which column should have those behaviors:
        
              For one TIMESTAMP column in a table,
              you can assign the current timestamp as the default value
              and the auto-update value. It is possible to have the
              current timestamp be the default value for initializing
              the column, for the auto-update value, or both. It is not
              possible to have the current timestamp be the default
              value for one column and the auto-update value for another
              column.
            
              You can specify which TIMESTAMP column
              to automatically initialize or update to the current date
              and time. This need not be the first
              TIMESTAMP column.
            
          The following rules govern initialization and updating of
          TIMESTAMP columns:
        
              If a DEFAULT value is specified for the
              first TIMESTAMP column in a table, it
              is not ignored. The default can be
              CURRENT_TIMESTAMP or a constant date
              and time value.
            
              DEFAULT NULL is the same as
              DEFAULT CURRENT_TIMESTAMP for the
              first TIMESTAMP
              column. For any other TIMESTAMP column,
              DEFAULT NULL is treated as
              DEFAULT 0.
            
              Any single TIMESTAMP column in a table
              can be used as the one that is initialized to the current
              timestamp or updated automatically.
            
              In a CREATE TABLE statement, the first
              TIMESTAMP column can be declared in any
              of the following ways:
            
                  With both DEFAULT CURRENT_TIMESTAMP
                  and ON UPDATE CURRENT_TIMESTAMP
                  clauses, the column has the current timestamp for its
                  default value, and is automatically updated.
                
                  With neither DEFAULT nor
                  ON UPDATE clauses, it is the same
                  as DEFAULT CURRENT_TIMESTAMP ON UPDATE
                  CURRENT_TIMESTAMP.
                
                  With a DEFAULT CURRENT_TIMESTAMP
                  clause and no ON UPDATE clause, the
                  column has the current timestamp for its default value
                  but is not automatically updated.
                
                  With no DEFAULT clause and with an
                  ON UPDATE CURRENT_TIMESTAMP clause,
                  the column has a default of 0 and is automatically
                  updated.
                
                  With a constant DEFAULT value, the
                  column has the given default. If the column has an
                  ON UPDATE CURRENT_TIMESTAMP clause,
                  it is automatically updated, otherwise not.
                
              In other words, you can use the current timestamp for both
              the initial value and the auto-update value, or either
              one, or neither. (For example, you can specify ON
              UPDATE to enable auto-update without also having
              the column auto-initialized.)
            
              CURRENT_TIMESTAMP or any of its
              synonyms (CURRENT_TIMESTAMP(),
              NOW(), LOCALTIME,
              LOCALTIME(),
              LOCALTIMESTAMP, or
              LOCALTIMESTAMP()) can be used in the
              DEFAULT and ON
              UPDATE clauses. They all mean “the current
              timestamp.” (UTC_TIMESTAMP is
              not allowed. Its range of values does not align with those
              of the TIMESTAMP column anyway unless
              the current time zone is UTC.)
            
              The order of the DEFAULT and
              ON UPDATE attributes does not matter.
              If both DEFAULT and ON
              UPDATE are specified for a
              TIMESTAMP column, either can precede
              the other. For example, these statements are equivalent:
            
CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                             ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                             DEFAULT CURRENT_TIMESTAMP);
              To specify automatic default or updating for a
              TIMESTAMP column other than the first
              one, you must suppress the automatic initialization and
              update behaviors for the first
              TIMESTAMP column by explicitly
              assigning it a constant DEFAULT value
              (for example, DEFAULT 0 or
              DEFAULT '2003-01-01 00:00:00'). Then,
              for the other TIMESTAMP column, the
              rules are the same as for the first
              TIMESTAMP column, except that if you
              omit both of the DEFAULT and
              ON UPDATE clauses, no automatic
              initialization or updating occurs.
            
Example. These statements are equivalent:
CREATE TABLE t (
    ts1 TIMESTAMP DEFAULT 0,
    ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                  ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (
    ts1 TIMESTAMP DEFAULT 0,
    ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                  DEFAULT CURRENT_TIMESTAMP);
          You can set the current time zone on a per-connection basis,
          as described in Section 5.11.8, “MySQL Server Time Zone Support”.
          TIMESTAMP values are stored in UTC, being
          converted from the current time zone for storage, and
          converted back to the current time zone upon retrieval. As
          long as the time zone setting remains constant, you get back
          the same value you store. If you store a
          TIMESTAMP value, and then change the time
          zone and retrieve the value, the retrieved value is different
          than the value you stored. This occurs because the same time
          zone was not used for conversion in both directions. The
          current time zone is available as the value of the
          time_zone system variable.
        
          You can include the NULL attribute in the
          definition of a TIMESTAMP column to allow
          the column to contain NULL values. For
          example:
        
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
          If the NULL attribute is not specified,
          setting the column to NULL sets it to the
          current timestamp. Note that a TIMESTAMP
          column which allows NULL values will
          not take on the current timestamp except
          under one of the following conditions:
        
              Its default value is defined as
              CURRENT_TIMESTAMP
            
              NOW() or
              CURRENT_TIMESTAMP is inserted into the
              column
            
          In other words, a TIMESTAMP column defined
          as NULL will auto-initialize only if it is
          created using a definition such as the following:
        
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
          Otherwise — that is, if the TIMESTAMP
          column is defined to allow NULL values but
          not using DEFAULT TIMESTAMP, as shown
          here…
        
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT NULL); CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');
…then you must explicitly insert a value corresponding to the current date and time. For example:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
        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).
      
        You can specify TIME values in a variety of
        formats:
      
            As a string in 'D HH:MM:SS.fraction'
            format. You can also use one of the following
            “relaxed” syntaxes:
            'HH:MM:SS.fraction',
            'HH:MM:SS', 'HH:MM',
            'D HH:MM:SS', 'D
            HH:MM', 'D HH', or
            'SS'. Here D
            represents days and can have a value from 0 to 34. Note that
            MySQL does not store the fraction part.
          
            As a string with no delimiters in
            'HHMMSS' format, provided that it makes
            sense as a time. For example, '101112' is
            understood as '10:11:12', but
            '109712' is illegal (it has a nonsensical
            minute part) and becomes '00:00:00'.
          
            As a number in HHMMSS format, provided
            that it makes sense as a time. For example,
            101112 is understood as
            '10:11:12'. The following alternative
            formats are also understood: SS,
            MMSS, HHMMSS,
            HHMMSS.fraction. Note that MySQL does not
            store the fraction part.
          
            As the result of a function that returns a value that is
            acceptable in a TIME context, such as
            CURRENT_TIME.
          
        For TIME values specified as strings that
        include a time part delimiter, it is not necessary to specify
        two digits for hours, minutes, or seconds values that are less
        than 10. '8:3:2' is the
        same as '08:03:02'.
      
        Be careful about assigning abbreviated values to a
        TIME column. Without colons, MySQL interprets
        values using the assumption that the two rightmost digits
        represent seconds. (MySQL interprets TIME
        values as elapsed time rather than as time of day.) For example,
        you might think of '1112' and
        1112 as meaning '11:12:00'
        (12 minutes after 11 o'clock), but MySQL interprets them as
        '00:11:12' (11 minutes, 12 seconds).
        Similarly, '12' and 12 are
        interpreted as '00:00:12'.
        TIME values with colons, by contrast, are
        always treated as time of the day. That is,
        '11:12' mean '11:12:00',
        not '00:11:12'.
      
        By default, values that lie outside the TIME
        range but are otherwise legal are clipped to the closest
        endpoint of the range. For example,
        '-850:00:00' and
        '850:00:00' are converted to
        '-838:59:59' and
        '838:59:59'. Illegal TIME
        values are converted to '00:00:00'. Note that
        because '00:00:00' is itself a legal
        TIME value, there is no way to tell, from a
        value of '00:00:00' stored in a table,
        whether the original value was specified as
        '00:00:00' or whether it was illegal.
      
        For more restrictive treatment of invalid
        TIME values, enable strict SQL mode to cause
        errors to occur. See Section 5.2.5, “The Server SQL Mode”.
      
        The YEAR type is a one-byte type used for
        representing years.
      
        MySQL retrieves and displays YEAR values in
        YYYY format. The range is
        1901 to 2155.
      
        You can specify YEAR values in a variety of
        formats:
      
            As a four-digit string in the range
            '1901' to '2155'.
          
            As a four-digit number in the range 1901
            to 2155.
          
            As a two-digit string in the range '00'
            to '99'. Values in the ranges
            '00' to '69' and
            '70' to '99' are
            converted to YEAR values in the ranges
            2000 to 2069 and
            1970 to 1999.
          
            As a two-digit number in the range 1 to
            99. Values in the ranges
            1 to 69 and
            70 to 99 are converted
            to YEAR values in the ranges
            2001 to 2069 and
            1970 to 1999. Note
            that the range for two-digit numbers is slightly different
            from the range for two-digit strings, because you cannot
            specify zero directly as a number and have it be interpreted
            as 2000. You must specify it as a string
            '0' or '00' or it is
            interpreted as 0000.
          
            As the result of a function that returns a value that is
            acceptable in a YEAR context, such as
            NOW().
          
        Illegal YEAR values are converted to
        0000.
      
As discussed in Section 1.4.5, “Year 2000 Compliance”, MySQL itself is year 2000 (Y2K) safe. However, particular input values presented to MySQL may not be Y2K safe. Any value containing a two-digit year is ambiguous, because the century is unknown. Such values must be interpreted into four-digit form because MySQL stores years internally using four digits.
        For DATETIME, DATE,
        TIMESTAMP, and YEAR types,
        MySQL interprets dates with ambiguous year values using the
        following rules:
      
            Year values in the range 00-69 are
            converted to 2000-2069.
          
            Year values in the range 70-99 are
            converted to 1970-1999.
          
Remember that these rules are only heuristics that provide reasonable guesses as to what your data values mean. If the rules used by MySQL do not produce the correct values, you should provide unambiguous input containing four-digit year values.
        ORDER BY properly sorts
        YEAR values that have two-digit years.
      
        Some functions like MIN() and
        MAX() convert a YEAR to a
        number. This means that a value with a two-digit year does not
        work properly with these functions. The fix in this case is to
        convert the TIMESTAMP or
        YEAR to four-digit year format.