写点什么

YashanDB DATE_SUB 函数

作者:YashanDB
  • 2025-05-08
    广东
  • 本文字数:1413 字

    阅读完需:约 5 分钟

DATE_SUB 函数用于执行日期运算,通过expr的值减去给定的区间值得到时间推进或后退过的结果。

expr

通用表达式,expr 的值须为 DATE、TIME、TIMESTAMP 类型,或可以转换为 DATE、TIMESTAMP 类型的字符类型。

  • 当 expr 为字面量时,只能为 DATE 和 TIMESTAMP 关键字的输入字符串,不能为 TIME 关键字的输入字符串。例如,DATE '2012-10-12'、TIMESTAMP '2012-10-12 10:20:24.000006'为函数可接受的 expr 值,而当 expr 为 TIME '10:20:24'时函数则返回错误。

  • 当 expr 为 NULL 时,函数返回 NULL。

interval_value

指定时间前进或后退的区间值,且必须为如下形式:

  • 0 或正整数字面量, 例如 0、1、2 等。

  • 包含 0 或正整数内容的字符串字面量, 例如'0'、'1'、'-2'等。

  • 包含负整数内容的字符串字面量, 例如'-1'、'-2'等。

  • 包含 INTERVAL 内容的字符串字面量, 例如'10-8'、'-8 8:10:24'等。

interval_unit

指定区间值的单位,该值不可为 NULL,且必须为如下形式:

  • MONTH、YEAR、YEAR TO MONTH 关键字(不区分大小写):此时 interval_value 被转换为 INTERVAL YEAR TO MONTH 类型。

  • SECOND、MINUTE、HOUR、DAY、MINUTE TO SECOND、HOUR TO SECOND、HOUR TO MINUTE、DAY TO SECOND、DAY TO MINUTE、DAY TO HOUR 关键字(不区分大小写):此时 interval_value 被转换为 INTERVAL DAY TO SECOND 类型。

interval_value 与 interval_unit 必须正确匹配,例如分别为 2/YEAR,3/HOUR,'10-8'/YEAR TO MONTH、'-8 8:10:24'/DAY TO SECOND,否则函数返回类型转换错误。

日期运算规则

  • 当 interval_value 为 INTERVAL YEAR TO MONTH 类型时,运算规则为:

    先进行 month 的增减,再判断 day 是否符合 month 的增减后的 day 数。

    如果增减后的 month 的天数小于增减前的 month 的天数,那么增减后的 day 数等于增减后的 month 的最后一天。

  • 当 expr 和 interval_value 的数据类型不相同时,函数先执行类型转换,若两个数据类型之间无法按照一定的规则进行转换,则返回类型转换错误。类型转换规则如下:

    expr 为 DATE/TIME/TIMESTAMP 类型时,无需转换,函数直接返回 expr 的数据类型。

    expr 为 CHAR/VARCHAR 类型时,函数将其转换为 DATE 类型,转换成功则返回转换后的数据类型,否则返回类型转换错误。

    expr 为 TIME,interval_value 为 INTERVAL DAY TO SECOND 类型时,超过范围将翻转,即超过 24 小时求余数,例如计算后的小时为 25 时,将其翻转为 1。

    expr 为 TIME,interval_value 为 INTERVAL YEAR TO MONTH 类型时,函数返回类型不支持错误。

示例

SELECT DATE_SUB('2012-10-12',INTERVAL  '-1' YEAR) res FROM DUAL;RES                                                              ---------------------------------------------------------------- 2013-10-12 00:00:00.000000  
-- interval_value为INTERVAL YEAR TO MONTH类型时SELECT DATE_SUB('2012-10-31',INTERVAL 1 MONTH) res FROM DUAL;RES ---------------------------------------------------------------- 2012-9-30 00:00:00.000000
-- interval_value为INTERVAL DAY TO SECOND类型时SELECT DATE_SUB(CAST('10:20:24' AS TIME),INTERVAL '8:10:24' HOUR TO SECOND) res FROM DUAL;RES -------------------- 02:10:00.000000
-- 小时翻转SELECT DATE_SUB(CAST('10:20:24' AS TIME),INTERVAL '14:10:24' HOUR TO SECOND) res FROM DUAL;RES -------------------- 20:10:00.000000
复制代码


用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB DATE_SUB函数_YashanDB_InfoQ写作社区