更新时间:2024-11-26 GMT+08:00
分享

日期与时间数据类型

表1 日期与时间数据类型

MySQL数据库

GaussDB数据库

差异

DATE

支持

GaussDB支持date数据类型,与MySQL相比规格上存在如下差异:

  • 输入格式
    • GaussDB只支持字符类型,不支持数值类型。如支持'2020-01-01'或'20200101'字符串格式,不支持20200101数值输入。MySQL支持数值输入转换为date类型。
    • 分隔符:GaussDB不支持加号“+”、冒号“:”作为年、月、日之间的分隔符,其他符号都支持。MySQL所有符号均可作为分隔符。 分隔符混合使用的某些场景也不支持,与MySQL也有差异,如'2020-01>01','2020/01+01'等,不建议混合使用分隔符,建议使用最常用的“-”、“/”作为分隔符。
    • 无分隔符:推荐使用完整格式,如 'YYYYMMDD' 或者 'YYMMDD'。其他不完整的格式(包括超长格式)解析的规则与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
  • 输出格式

    GaussDB在sql_mode参数不包含'strict_trans_tables'选项(定义为宽松模式,否则为严格模式)时,允许年、月、日的值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如date '0000-00-10' 转换为:0002-12-10 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00值。MySQL对于包含0值年、月、日的date值会原样输出。

  • 取值范围

    GaussDB的范围是4713-01-01 BC ~ 5874897-12-31 AD,支持公元前的日期,宽松模式下超过范围时,返回的是0值:0000-00-00,严格模式下会报错。MySQL的范围是 0000-00-00 ~ 9999-12-31,宽松模式下超过范围后,各个场景下的表现并不一致,可能报错(如SELECT查询语句中),也可能返回0000-00-00值(如INSERT时)。此差异会导致date类型作为函数入参时,函数返回的结果存在差异。

  • 操作符
    • GaussDB仅支持date类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;date与interval类型的加法运算,返回结果为date类型;date与interval类型的减法运算,返回结果为date类型;date类型之间的减法运算,返回结果为interval类型。
    • MySQL date类型和其他数值类型运算时,会先将date转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    -- MySQL: date + 数值,先将date类型转换为数值20200101,再与1相加,结果为数值类型20200102
    mysql> SELECT date'2020-01-01' + 1;
    +----------------------+
    | date'2020-01-01' + 1 |
    +----------------------+
    |             20200102 |
    +----------------------+
    1 row in set (0.00 sec)
    
    -- GaussDB: date + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的日期。
    gaussdb=# SELECT date'2020-01-01' + 1;
      ?column?  
    ------------
     2020-01-02
    (1 row)
    
  • 类型转换

    相比较MySQL,GaussDB仅支持date类型与char(n)、nchar(n)、datetime、timestamp类型之间的相互转换,不支持与binary、decimal、json、integer、unsigned integer、time 类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。

DATETIME[(fsp)]

支持

GaussDB支持datetime数据类型,与MySQL相比规格上存在如下差异:

  • 输入格式
    • GaussDB只支持字符类型,不支持数值类型。如支持'2020-01-01 10:20:30.123456'或'20200101102030.123456'字符串格式,不支持如20200101102030.123456的数值类型输入。MySQL支持数值输入转换为datetime类型。
    • 分隔符:GaussDB不支持加号“+”、冒号“:”作为年、月、日之间的分隔符,其他的符号都支持。仅支持冒号“:”作为时、分、秒之间的分隔符,其他的符号都不支持。分隔符混合使用的某些场景也不支持,与MySQL也有差异,不推荐使用。MySQL支持所有符号作为分隔符。
    • 无分隔符:GaussDB推荐使用完整格式'YYYYMMDDhhmiss.ffffff'。其他不完整的格式(包括超长格式)解析的规则可能与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
  • 输出格式:
    • 统一为'YYYY-MM-DD hh:mi:ss.ffffff'的格式,格式与MySQL无差异,且不受DateStyle参数的影响。但是对于精度部分,如果最后几位为0,GaussDB不显示,MySQL会显示。
    • GaussDB在sql_mode参数不包含'strict_trans_tables'选项(定义为宽松模式,否则为严格模式)时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如datetime '0000-00-10 00:00:00' 转换为:0002-12-10 00:00:00 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。MySQL对于包含0值年、月、日的datetime值会原样输出。
  • 取值范围

    4713-11-24 00:00:00.000000 BC ~ 294277-01-09 04:00:54.775806 AD。294277-01-09 04:00:54.775807 AD 返回的是infinity。对于超过范围的值,严格模式下GaussDB会报错,MySQL是否报错取决于使用场景。一般查询场景不报错,而执行DML SQL语句更改表属性的值时报错。宽松模式下GaussDB返回0000-00-00 00:00:00值,MySQL根据使用场景可能报错,也可能返回0000-00-00 00:00:00值或者null值。这个差异会导致以datetime类型为入参的函数执行结果与MySQL也存在差异。

  • 精度

    范围0~6,作为表列的类型时缺省为0,与MySQL一致。对于 datetime[(p)] 'str' 表达式场景,GaussDB将(p)作为精度解析,缺省为6,将'str'按照p指定的精度格式化成datetime类型。MySQL不支持datetime[(p)] 'str'表达式。

  • 操作符
    • GaussDB仅支持datetime类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;datetime与interval类型的加法运算,返回结果为datetime类型;datetime与interval 类型的减法运算,返回结果为datetime类型;datetime类型之间的减法运算,返回结果为interval类型。
    • MySQL datetime类型和其他数值类型运算时,会先将datetime转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    -- MySQL: datetime + 数值,先将datetime类型转换为数值20201010123456,再与1相加,结果为数值类型20201010123457
    mysql> SELECT cast('2020-10-10 12:34:56.123456' AS datetime) + 1;
    +----------------------------------------------------+
    | cast('2020-10-10 12:34:56.123456' as datetime) + 1 |
    +----------------------------------------------------+
    |                                     20201010123457 |
    +----------------------------------------------------+
    1 row in set (0.00 sec)
    
    -- GaussDB: datetime + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的datetime。
    gaussdb=# SELECT cast('2020-10-10 12:34:56.123456' AS datetime) + 1;
          ?column?       
    ---------------------
     2020-10-11 12:34:56
    (1 row)
    

    将datetime类型与数值的运算结果作为函数的入参,可能导致函数的结果与MySQL也存在差异。

  • 类型转换

    相比较MySQL,GaussDB仅支持datetime类型与char(n)、varchar(n)、timestamp类型之间的相互转换、datetime到date、time类型的转换(仅赋值和显式转换)。不支持与binary、decimal、json、integer、unsigned integer类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。

  • 时区

    GaussDB支持datetime值中携带时区信息(时区偏移或者时区名),如'2020-01-01 12:34:56.123456 +01:00' 或者 '2020-01-01 2:34:56.123456 CST'。GaussDB会将其转换为当前服务器时区的时间。MySQL不支持(5.7版本不支持,8.0及之后的版本支持)。

  • GaussDB的datetime数据类型的表字段实际上会被转换为timestamp(p) without time zone类型,查询表信息或者使用工具导出的表结构,其字段的数据类型显示的是timestamp(p) without time zone,而不是datetime。MySQL显示的是datetime(p)。

TIMESTAMP[(fsp)]

支持

GaussDB支持timestamp数据类型,与MySQL相比规格上存在如下差异:

  • 输入格式:
    • 只支持字符类型,不支持数值类型。如支持'2020-01-01 10:20:30.123456'或'20200101102030.123456'字符串格式,不支持如20200101102030.123456的数值类型输入。MySQL支持数值输入转换为timestamp类型。
    • 分隔符:不支持加号“+”、冒号“:”作为年、月、日之间的分隔符,其他的符号都支持。仅支持冒号“:”作为时、分、秒之间的分隔符,其他的符号都不支持。分隔符混合使用的某些场景也不支持,与MySQL也有差异,不推荐使用。MySQL支持所有符号作为分隔符。
    • 无分隔符:推荐使用完整格式'YYYYMMDDhhmiss.ffffff'。其他不完整的格式(包括超长格式)解析的规则可能与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
  • 输出格式:
    • 统一为'YYYY-MM-DD hh:mi:ss.ffffff'的格式,格式与MySQL无差异,且不受DateStyle参数的影响。但是对于精度部分,如果最后几位为0,GaussDB不显示,MySQL会显示。
    • GaussDB在sql_mode参数不包含'strict_trans_tables'选项(定义为宽松模式,否则为严格模式)时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如timestamp '0000-00-10 00:00:00' 转换为:0002-12-10 00:00:00 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。MySQL对于包含0值年、月、日的timestamp值会原样输出。
  • 取值范围:

    4713-11-24 00:00:00.000000 BC ~ 294277-01-09 04:00:54.775806 AD。294277-01-09 04:00:54.775807 AD 返回的是infinity。对于超过范围的值,严格模式下GaussDB会报错,MySQL是否报错取决于使用场景。一般查询场景不报错,而执行DML SQL语句更改表属性的值时报错。宽松模式下GaussDB返回0000-00-00 00:00:00值,MySQL根据使用场景可能报错,也可能返回0000-00-00 00:00:00值或者null值。这个差异会导致以timestamp类型为入参的函数执行结果与MySQL也存在差异。

  • 精度:
    范围0~6,作为表列的类型时缺省为0,与MySQL一致。对于 timestamp[(p)] 'str' 表达式场景:
    • GaussDB将(p)作为精度解析,缺省为6,将'str'按照p指定的精度格式化成timestamp类型。
    • MySQL将timestamp 'str'的含义与GaussDB一致,缺省精度也为6。但是将timestamp(p) 'str'解析为函数调用,p作为timestamp函数的入参,结果返回一个timestamp类型的值,'str'作为投影列的别名。
  • 操作符:
    • GaussDB仅支持timestamp类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;timestamp与interval类型的加法运算,返回结果为timestamp类型;timestamp与interval类型的减法运算,返回结果为timestamp类型;timestamp类型之间的减法运算,返回结果为interval类型。
    • MySQL timestamp类型和其他数值类型运算时,会先将timestamp转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    -- MySQL: timestamp + 数值,先将timestamp类型转换为数值20201010123456.123456,再与1相加,结果为数值类型20201010123457.123456
    mysql> SELECT timestamp '2020-10-10 12:34:56.123456' + 1;
    +--------------------------------------------+
    | timestamp '2020-10-10 12:34:56.123456' + 1 |
    +--------------------------------------------+
    |                      20201010123457.123456 |
    +--------------------------------------------+
    1 row in set (0.00 sec)
    
    -- GaussDB: timestamp + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的timestamp。
    gaussdb=# SELECT timestamp '2020-10-10 12:34:56.123456' + 1;
              ?column?          
    ----------------------------
     2020-10-11 12:34:56.123456
    (1 row)
    

    将timestamp类型与数值的运算结果作为函数的入参,可能导致函数的结果与MySQL也存在差异。

  • 类型转换:

    相比较MySQL,GaussDB仅支持timestamp类型与char(n)、varchar(n)、datetime类型之间的相互转换、timestamp到date、time类型的转换(仅赋值和显式转换)。不支持与binary、decimal、json、integer、unsigned integer类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。

  • 时区:

    GaussDB支持timestamp值中携带时区信息(时区偏移或者时区名),如'2020-01-01 12:34:56.123456 +01:00' 或者 '2020-01-01 2:34:56.123456 CST'。GaussDB会将其转换为当前服务器时区的时间。如果更改服务器时区,timestamp类型的值输出时会转换为更改后时区的时间戳。MySQL不支持(5.7版本不支持,8.0及之后的版本支持)。

  • GaussDB的timestamp数据类型的表字段实际上会被转换为timestamp(p) with time zone类型,查询表信息或者使用工具导出的表结构,其字段的数据类型显示的是timestamp(p) with time zone,而不是timestamp。MySQL显示的是timestamp(p)。

TIME[(fsp)]

支持

GaussDB支持time数据类型,与MySQL相比规格上存在如下差异:

  • 输入格式:
    • 只支持字符类型,不支持数值类型。如支持'1 10:20:30'或'102030'字符串格式,不支持102030数值输入。MySQL支持数值输入转换为time类型。
    • 分隔符:GaussDB仅支持冒号“:”作为时、分、秒之间的分隔符,其他的符号都不支持。MySQL支持所有的符号作为分隔符。
    • 无分隔符:推荐使用完整格式,如 'hhmiss.ffffff'。其他不完整的格式(包括超长格式)解析的规则可能与MySQL存在差异,可能报错或者解析的结果与MySQL不一致,不推荐使用。
    • 分、秒、精度输入负数时,GaussDB数据库可能会忽略第一个负数开始的部分,涉及的部分解析为0,如:'00:00:-10' 解析结果为 '00:00:00'。 也可能报错,如:'00:00:-10000' 会解析报错。取决于输入值的范围。而MySQL数据库统一报错。
  • 输出格式:

    统一为hh:mi:ss.ffffff的格式,格式与MySQL无差异。但是对于精度部分,如果最后几位为0,GaussDB不显示,MySQL会显示。

  • 取值范围:

    -838:59:59.000000 ~ 838:59:59.000000,与MySQL一致。对于超过范围的值,GaussDB在宽松模式下执行SELECT、INSERT、UPDATE等DML操作时,返回的值都是就近的边界值:-838:59:59或838:59:59。MySQL是查询时报错,DML操作返回的值才是就近边界值,场景上存在差异。此差异会导致time类型作为函数入参时,函数返回的结果也存在差异。

  • 精度:

    范围0~6,作为表列的类型时缺省为0,与MySQL一致。对于 time(p) 'str' 表达式场景,GaussDB将(p)作为精度解析,缺省为6,将'str'按照p指定的精度格式化成time类型。MySQL是解析为time函数,p是入参,'str'是投影列的别名。

  • 操作符:
    • GaussDB仅支持time类型之间的比较操作符“=”、“!=”、“<”、“<=”、“>”、“>=”,返回true或者false;time与interval类型的加法运算,返回结果为time类型;time与interval类型的减法运算,返回结果为time类型;time类型之间的减法运算,返回结果为interval类型。
    • MySQL time类型和其他数值类型运算时,会先将time转换为数值类型,然后按照数值类型运算,结果也为数值类型。与GaussDB存在差异。如:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    -- MySQL: time + 数值,先将time类型转换为数值123456,再与1相加,结果为数值类型123457
    mysql> SELECT time '12:34:56' + 1;
    +---------------------+
    | time '12:34:56' + 1 |
    +---------------------+
    |              123457 |
    +---------------------+
    1 row in set (0.00 sec)
    
    -- GaussDB: time + 数值,数值类型会转换为interval类型 1 day,然后相加得到新的time,由于是加了24小时,得到的仍然是12:34:56。
    gaussdb=# SELECT time '12:34:56' + 1;
     ?column? 
    ----------
     12:34:56
    (1 row)
    

    将time类型与数值的运算结果作为函数的入参,可能导致函数的结果与MySQL也存在差异。

  • 类型转换:

    相比较MySQL,GaussDB仅支持time类型与char(n)、nchar(n)类型之间的相互转换、datetime、timestamp到time类型的转换。不支持与binary、decimal、date、json、integer、unsigned integer类型之间的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。

YEAR[(4)]

支持

GaussDB支持year数据类型,与MySQL相比规格上存在如下差异:

  • 操作符:
    • GaussDB仅支持year类型之间的比较操作符:=、!=、<、<=、>、>=。返回true或者false。
    • GaussDB仅支持year类型与int4类型之间的算术操作符:+、-。返回整型值,MySQL是返回无符号整型值。
  • 类型转换:

    相比较MySQL,GaussDB仅支持year类型与int4类型的转换,仅支持int4、varchar、numeric、date、time、timestamp、timestamptz类型到year类型的转换。集合等场景和复杂表达式场景下公共类型的确定原则与MySQL也不一致,参考数据类型转换章节的描述。

INTERVAL

支持

GaussDB支持INTERVAL数据类型,但INTERVAL在MySQL中为表达式,同时存在以下差异:

  • 不支持字符串类型的日期输入作为运算,如:SELECT '2023-01-01' + interval 1 day。
  • 不支持interval expr unit语法中,expr为负整数或浮点数的输入,如:SELECT date'2023-01-01' + interval -1 day。
  • 不支持interval expr unit语法中,expr为运算表达式的输入,如:SELECT date'2023-01-01' + interval 4/2 day。
  • interval表达式参与运算时,返回值固定为datetime类型,MySQL为datetime或date类型。运算的逻辑与原有GaussDB保持一致,与MySQL有差异。
  • interval expr unit语法中,expr数值支持的范围会根据unit单位的不同有所差异,最大可支持的范围为[-2147483648, 2147483647]。超过范围时,严格模式报error,宽松模式报warning并返回0值。
  • interval expr unit语法中,expr指定的字段数量大于unit预期的字段数量时,在严格模式,报error;在宽松模式,报warning并返回0值。如unit取值为DAY_HOUR,预期的字段数量为2,expr取值为'1-2-3',字段数量为3。

相关文档