PostgreSQL数据库中创建date_sub和date_add函数的创建

date_add函数的创建(根据需求写单位)

CREATE OR REPLACE FUNCTION date_add(start_date DATE, interval_value INTEGER, interval_unit TEXT)
RETURNS DATE AS $$
BEGIN
  interval_unit := LOWER(interval_unit); -- 将时间单位转换为小写
  
  IF interval_unit = 'year' THEN -- 将'YEAR'改为'year'
    RETURN start_date + INTERVAL '1 YEAR' * interval_value;
  ELSIF interval_unit = 'month' THEN -- 将'MONTH'改为'month'
    RETURN start_date + INTERVAL '1 MONTH' * interval_value;
  ELSIF interval_unit = 'week' THEN -- 将'WEEK'改为'week'
    RETURN start_date + INTERVAL '1 WEEK' * interval_value;
  ELSIF interval_unit = 'day' THEN -- 将'DAY'改为'day'
    RETURN start_date + INTERVAL '1 DAY' * interval_value;
  ELSIF interval_unit = 'hour' THEN -- 添加'hour'判断
    RETURN start_date + INTERVAL '1 HOUR' * interval_value;
  ELSIF interval_unit = 'minute' THEN -- 添加'minute'判断
    RETURN start_date + INTERVAL '1 MINUTE' * interval_value;
  ELSIF interval_unit = 'second' THEN -- 添加'second'判断
    RETURN start_date + INTERVAL '1 SECOND' * interval_value;
  ELSE
    RAISE EXCEPTION 'Invalid interval unit: %', interval_unit;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION date_add(start_date timestamp with time zone, interval_value INTEGER, interval_unit TEXT)
RETURNS timestamp with time zone AS $$
BEGIN
  interval_unit := LOWER(interval_unit); -- 将时间单位转换为小写
  
  IF interval_unit = 'year' THEN -- 将'YEAR'改为'year'
    RETURN start_date + INTERVAL '1 YEAR' * interval_value;
  ELSIF interval_unit = 'month' THEN -- 将'MONTH'改为'month'
    RETURN start_date + INTERVAL '1 MONTH' * interval_value;
  ELSIF interval_unit = 'week' THEN -- 将'WEEK'改为'week'
    RETURN start_date + INTERVAL '1 WEEK' * interval_value;
  ELSIF interval_unit = 'day' THEN -- 将'DAY'改为'day'
    RETURN start_date + INTERVAL '1 DAY' * interval_value;
  ELSIF interval_unit = 'hour' THEN -- 添加'hour'判断
    RETURN start_date + INTERVAL '1 HOUR' * interval_value;
  ELSIF interval_unit = 'minute' THEN -- 添加'minute'判断
    RETURN start_date + INTERVAL '1 MINUTE' * interval_value;
  ELSIF interval_unit = 'second' THEN -- 添加'second'判断
    RETURN start_date + INTERVAL '1 SECOND' * interval_value;
  ELSE
    RAISE EXCEPTION 'Invalid interval unit: %', interval_unit;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION date_add(start_date timestamp without time zone, interval_value INTEGER, interval_unit TEXT)
RETURNS timestamp without time zone AS $$
BEGIN
  interval_unit := LOWER(interval_unit); -- 将时间单位转换为小写
  
  IF interval_unit = 'year' THEN -- 将'YEAR'改为'year'
    RETURN start_date + INTERVAL '1 YEAR' * interval_value;
  ELSIF interval_unit = 'month' THEN -- 将'MONTH'改为'month'
    RETURN start_date + INTERVAL '1 MONTH' * interval_value;
  ELSIF interval_unit = 'week' THEN -- 将'WEEK'改为'week'
    RETURN start_date + INTERVAL '1 WEEK' * interval_value;
  ELSIF interval_unit = 'day' THEN -- 将'DAY'改为'day'
    RETURN start_date + INTERVAL '1 DAY' * interval_value;
  ELSIF interval_unit = 'hour' THEN -- 添加'hour'判断
    RETURN start_date + INTERVAL '1 HOUR' * interval_value;
  ELSIF interval_unit = 'minute' THEN -- 添加'minute'判断
    RETURN start_date + INTERVAL '1 MINUTE' * interval_value;
  ELSIF interval_unit = 'second' THEN -- 添加'second'判断
    RETURN start_date + INTERVAL '1 SECOND' * interval_value;
  ELSE
    RAISE EXCEPTION 'Invalid interval unit: %', interval_unit;
  END IF;
END;
$$ LANGUAGE plpgsql;

测试:

-- 在MySQL中SELECT DATE_ADD('2021-05-20', INTERVAL 1 DAY);在PgSQL中SELECT '2021-05-20' + INTERVAL '1 DAY';
-- 日期运算符+和INTERVAL '1 DAY'表示对日期进行加1天的操作。或者是SELECT DATE_TRUNC('day', '2021-05-20') + INTERVAL '1 DAY';
-- DATE_TRUNC()函数将日期'2021-05-20'截断为天,然后使用+和INTERVAL '1 DAY'进行加1天的操作。

SELECT DATE_ADD('2021-05-20'::date, 1, 'YEAR');

-- SELECT '2021-05-20'::date + INTERVAL '1 DAY';

-- SELECT DATE_TRUNC('day', '2021-05-20'::date) + INTERVAL '1 DAY';

select upper('day') = 'DAY';

SELECT date_add('2023-09-27', 2, 'YEAR'); -- 返回 2025-09-27
-- SELECT date_add('2023-09-27', 2, 'year'); -- 返回 2025-09-27

SELECT date_add('2023-09-27', 3, 'MONTH'); -- 返回 2023-12-27
SELECT date_add('2023-09-27', -1, 'WEEK'); -- 返回 2023-09-20
SELECT date_add('2023-09-27', 4, 'DAY'); -- 返回 2023-10-01
-- SELECT date_add('2023-09-27', 4, 'day'); -- 返回 2023-10-01

SELECT date_add('2023-09-27', 2, 'Year'); -- 返回 2025-09-27
SELECT date_add('2023-09-27', 3, 'month'); -- 返回 2023-12-27
SELECT date_add('2023-09-27', -1, 'WEEK'); -- 返回 2023-09-20
SELECT date_add('2023-09-27', 4, 'dAY'); -- 返回 2023-10-01
SELECT date_add('2023-09-27', 1, 'Hour'); -- 返回 2023-09-27
SELECT date_add('2023-09-27', 30, 'minute'); -- 返回 2023-09-27
SELECT date_add('2023-09-27', 10, 'second'); -- 返回 2023-09-27

select date_add((select created_at from t_rule where "id" = 200001),1,'day');
select "id",created_at from t_rule;
select "id",date_add(created_at,1,'minute') from t_rule;

date_sub函数的创建(根据需求写单位)

CREATE OR REPLACE FUNCTION date_sub(start_date DATE, interval_value INTEGER, interval_unit TEXT)
RETURNS DATE AS $$
BEGIN
  interval_unit := LOWER(interval_unit); -- 将时间单位转换为小写
  
  IF interval_unit = 'year' THEN -- 将'YEAR'改为'year'
    RETURN start_date - INTERVAL '1 YEAR' * interval_value;
  ELSIF interval_unit = 'month' THEN -- 将'MONTH'改为'month'
    RETURN start_date - INTERVAL '1 MONTH' * interval_value;
  ELSIF interval_unit = 'week' THEN -- 将'WEEK'改为'week'
    RETURN start_date - INTERVAL '1 WEEK' * interval_value;
  ELSIF interval_unit = 'day' THEN -- 将'DAY'改为'day'
    RETURN start_date - INTERVAL '1 DAY' * interval_value;
  ELSIF interval_unit = 'hour' THEN -- 添加'hour'判断
    RETURN start_date - INTERVAL '1 HOUR' * interval_value;
  ELSIF interval_unit = 'minute' THEN -- 添加'minute'判断
    RETURN start_date - INTERVAL '1 MINUTE' * interval_value;
  ELSIF interval_unit = 'second' THEN -- 添加'second'判断
    RETURN start_date - INTERVAL '1 SECOND' * interval_value;
  ELSE
    RAISE EXCEPTION 'Invalid interval unit: %', interval_unit;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION date_sub(start_date timestamp with time zone, interval_value INTEGER, interval_unit TEXT)
RETURNS timestamp with time zone AS $$
BEGIN
  interval_unit := LOWER(interval_unit);
  
  IF interval_unit = 'year' THEN -- 将'YEAR'改为'year'
    RETURN start_date - INTERVAL '1 YEAR' * interval_value;
  ELSIF interval_unit = 'month' THEN -- 将'MONTH'改为'month'
    RETURN start_date - INTERVAL '1 MONTH' * interval_value;
  ELSIF interval_unit = 'week' THEN -- 将'WEEK'改为'week'
    RETURN start_date - INTERVAL '1 WEEK' * interval_value;
  ELSIF interval_unit = 'day' THEN -- 将'DAY'改为'day'
    RETURN start_date - INTERVAL '1 DAY' * interval_value;
  ELSIF interval_unit = 'hour' THEN -- 添加'hour'判断
    RETURN start_date - INTERVAL '1 HOUR' * interval_value;
  ELSIF interval_unit = 'minute' THEN -- 添加'minute'判断
    RETURN start_date - INTERVAL '1 MINUTE' * interval_value;
  ELSIF interval_unit = 'second' THEN -- 添加'second'判断
    RETURN start_date - INTERVAL '1 SECOND' * interval_value;
  ELSE
    RAISE EXCEPTION 'Invalid interval unit: %', interval_unit;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION date_sub(start_date timestamp without time zone, interval_value INTEGER, interval_unit TEXT)
RETURNS timestamp without time zone AS $$
BEGIN
  interval_unit := LOWER(interval_unit);
  
  IF interval_unit = 'year' THEN -- 将'YEAR'改为'year'
    RETURN start_date - INTERVAL '1 YEAR' * interval_value;
  ELSIF interval_unit = 'month' THEN -- 将'MONTH'改为'month'
    RETURN start_date - INTERVAL '1 MONTH' * interval_value;
  ELSIF interval_unit = 'week' THEN -- 将'WEEK'改为'week'
    RETURN start_date - INTERVAL '1 WEEK' * interval_value;
  ELSIF interval_unit = 'day' THEN -- 将'DAY'改为'day'
    RETURN start_date - INTERVAL '1 DAY' * interval_value;
  ELSIF interval_unit = 'hour' THEN -- 添加'hour'判断
    RETURN start_date - INTERVAL '1 HOUR' * interval_value;
  ELSIF interval_unit = 'minute' THEN -- 添加'minute'判断
    RETURN start_date - INTERVAL '1 MINUTE' * interval_value;
  ELSIF interval_unit = 'second' THEN -- 添加'second'判断
    RETURN start_date - INTERVAL '1 SECOND' * interval_value;
  ELSE
    RAISE EXCEPTION 'Invalid interval unit: %', interval_unit;
  END IF;
END;
$$ LANGUAGE plpgsql;

测试:

SELECT DATE_SUB('2021-05-20'::date, 1, 'YEAR');

SELECT date_sub('2023-09-27', 2, 'YEAR'); -- 返回 2025-09-27
-- SELECT date_add('2023-09-27', 2, 'year'); -- 返回 2025-09-27

SELECT date_sub('2023-09-27', 3, 'MONTH'); -- 返回 2023-12-27
SELECT date_sub('2023-09-27', -1, 'WEEK'); -- 返回 2023-09-20
SELECT date_sub('2023-09-27', 4, 'DAY'); -- 返回 2023-10-01
-- SELECT date_add('2023-09-27', 4, 'day'); -- 返回 2023-10-01

SELECT date_sub('2023-09-27', 2, 'Year'); -- 返回 2025-09-27
SELECT date_sub('2023-09-27', 3, 'month'); -- 返回 2023-12-27
SELECT date_sub('2023-09-27', -1, 'WEEK'); -- 返回 2023-09-20
SELECT date_sub('2023-09-27', 4, 'dAY'); -- 返回 2023-10-01
SELECT date_sub('2023-09-27', 1, 'Hour'); -- 返回 2023-09-27
SELECT date_sub('2023-09-27', 30, 'minute'); -- 返回 2023-09-27
SELECT date_sub('2023-09-27', 10, 'second'); -- 返回 2023-09-27

select date_sub((select created_at from t_rule where "id" = 200001),1,'day');
select "id",created_at from t_rule;
select "id",date_sub(created_at,1,'minute') from t_rule;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值