日期和时间函数
以下为GaussDB M-Compatibility兼容性日期时间函数公共说明。
- 《M-Compatibility开发指南》中“函数和操作符”章节函数入参为时间类型表达式的情况:
时间类型表达式主要包括TEXT、DATETIME、DATE或TIME,但所有可以隐式转换为时间表达式的类型都可以作为入参,比如数字类型可以通过先隐式转化为TEXT,再作为时间类型表达式生效。
生效的情况根据函数有所不同,比如:DATEDIFF函数由于只计算日期的差值,所以时间表达式会当做日期来解析。TIMESTAMPDIFF函数由于计算时间差值时是根据UNIT来决定的,所以会根据UNIT选择将时间表达式当做DATE或者TIME或者DATETIME来解析。
- 当SELECT子查询中包含且仅包含时间函数,且函数入参包含表中的列时,使用算数运算符(如+、-、*、/、取反等)对结果进行运算时,会截断日期与时间函数返回值后再进行算数运算。
m_db=# CREATE TABLE t1(int_var int); CREATE TABLE m_db=# INSERT INTO t1 VALUES(100); INSERT 0 1 m_db=# SELECT (SELECT (1 * DATE_ADD('2020-10-20', interval int_var microsecond))) AS a FROM t1; -- 不进行截断处理。 a ---------------- 20201020000000 (1 row) m_db=# SELECT (1 * (SELECT DATE_ADD('2020-10-20', interval int_var microsecond))) AS a FROM t1; -- 进行截断处理。 a ------ 2020 (1 row) m_db=# SELECT 1 * a FROM (SELECT (SELECT 1 * DATE_ADD('2020-10-20', interval int_var microsecond)) AS a FROM t1) AS t2; -- 不进行截断处理。 1 * a ---------------- 20201020000000 (1 row) m_db=# SELECT 1 * a FROM (SELECT (SELECT DATE_ADD('2020-10-20', interval int_var microsecond)) AS a FROM t1) AS t2; -- 进行截断处理。 1 * a ------- 2020 (1 row)
- 函数入参为无效日期的情况:
一般而言,日期时间函数支持DATE、DATETIME的范围和MySQL保持一致。DATE支持的范围为'0000-01-01'到'9999-12-31',DATETIME支持的范围为'0000-01-01 00:00:00'到'9999-12-31 23:59:59'。虽然GaussDB支持的DATE、DATETIME范围大于MySQL,但是越界仍然算无效日期。
大部分时间函数会告警并返回NULL,只有能通过cast正常转换的日期,才是正常合理的日期。
新框架下GaussDB的大部分日期时间函数与MySQL一致,一些函数的差异如下表所示: