当前位置: 首页 > 面试题库 >

PostgreSQL日期差异

孙玺
2023-03-14
问题内容

我有一个PostgreSQL函数来计算日期差:

CREATE OR REPLACE FUNCTION testDateDiff () RETURNS int AS $BODY$
DECLARE startDate TIMESTAMP;
DECLARE endDate TIMESTAMP;
DECLARE diffDatePart int ;
BEGIN
Select evt_start_date From events Where evt_id = 5 INTO startDate ;
Select evt_start_date From events Where evt_id = 6 INTO  endDate ;
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
RETURN diffDatePart;
END;
$BODY$
LANGUAGE plpgsql 
COST 100

如果直接减去日期,则会计算出差额。但是在我的情况下,日期在变量asstartDate和中存在endDate,这导致了问题。

如何减去变量中包含的日期?


问题答案:

除错

你的函数是做可以做 很多 简单。语法错误的实际原因在这里:

SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;

看来您正在尝试转换startDatetimestamp,这是毫无意义的,因为您的参数startDate已声明为timestamp已经。

这也行不通。我在这里引用手册:

为避免语法歧义,“字符串”类型的语法只能用于指定简单文字常量的类型。

像这样工作:

SELECT EXTRACT(day FROM startDate - endDate)::int INTO diffDatePart;

但这仍然没有多大意义。您在谈论“日期”,但仍将参数定义为timestamp。您 可以这样 消毒:

CREATE OR REPLACE FUNCTION f_date_diff()
  RETURNS int AS
$BODY$
DECLARE
    start_date date;
    end_date   date;
    date_diff  int;
BEGIN
SELECT evt_start_date FROM events WHERE evt_id = 5 INTO start_date;
SELECT evt_start_date FROM events WHERE evt_id = 6 INTO end_date;
date_diff := (endDate - startDate);
RETURN date_diff;
END
$BODY$ LANGUAGE plpgsql;
  • DECLARE 只需要一次。
  • date声明为适当类型的列date
  • 除非您确切知道自己在做什么,否则不要使用大小写混合的标识符。
  • 末尾 减去 起始 数得到正数或应用绝对值运算符。 __@
  • 由于减去 日期 (相对于减去 timestamps 会产生一个interval)已经产生integer,因此简化为:
    SELECT (startDate - endDate) INTO diffDatePart;
    

甚至比plpgsql分配更简单:

    diffDatePart := (startDate - endDate);

简单查询

您可以通过简单的查询来解决简单的任务-使用子查询:

SELECT (SELECT evt_start_date
        FROM   events
        WHERE  evt_id = 6) 
      - evt_start_date AS date_diff
FROM   events
WHERE  evt_id = 5;

或者,您也可以CROSS JOIN将基表设置为自身(每个实例1行,这样就可以了):

SELECT e.evt_start_date - s.evt_start_date AS date_diff
FROM   events e
      ,events s
WHERE  e.evt_id = 6
AND    s.evt_id = 5;

SQL函数

如果您坚持要使用函数,请使用简单的sql函数:

CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
  RETURNS int LANGUAGE sql AS
$func$
SELECT e.evt_start_date - s.evt_start_date
FROM   events s, events e
WHERE  s.evt_id = $1
AND    e.evt_id = $2
$func$;

称呼:

SELECT  f_date_diff(5, 6);

PL / pgSQL函数

如果您坚持使用plpgsql …

CREATE OR REPLACE FUNCTION f_date_diff(_start_id int, _end_id int)
  RETURNS int LANGUAGE plpgsql AS
$func$
BEGIN

RETURN (SELECT evt_start_date 
             - (SELECT evt_start_date FROM events WHERE evt_id = _start_id)
        FROM   events WHERE evt_id = _end_id);
END
$func$;

相同的电话。



 类似资料:
  • 问题内容: 我试图找出表中某些字段之间的时间。但是由于我正在使用Postgresql :(( 我无法使用DATEDIFF函数。我在网上找不到任何清晰的指南/教程,这些指南/教程显示了如何在Postgres中执行类似的操作,因此我需要做同样的事情的帮助但在Postgres 我假设如果我使用支持DATEDIFF函数的RDBMS,则此查询将起作用,因此,基本上我的问题是如何更改它,以便它使用Postgr

  • 问题内容: 功能: 我的要求是找出几年中两个日期之间的差异。所以,我写了上面的函数。在此,如果d1为NULL,则将其分配为当前日期。但是,它会产生如下所示的错误。 有没有人能帮助我解决这个问题。 问题答案: 尝试 : 函数以以下格式返回两个日期之间的年,月和天数: 从此输出中使用,以选择唯一的年份差异。也没有必要把if语句来处理,因为我已经添加返回第一值,所以,如果是它返回 功能结构: 函数调用:

  • 日期/时间操作符 下表演示了基本算术操作符的行为(+,*, 等): 操作符 例子 结果 + date '2001-09-28' + integer '7' date '2001-10-05' + date '2001-09-28' + interval '1 hour' timestamp '2001-09-28 01:00:00' + date '2001-09-28' + time '03:0

  • 我正在尝试使用QueryDSL计算用户年龄和日期差。 但失败时出现此错误 谢谢

  • 问题内容: 我正在使用以下代码获取当前日期(格式为12/31/1999,即mm / dd / yyyy): 我还有另一个日期格式为:2019-08-25(即yyyy / mm / dd), 所以我想找出日期之间的天数差异,如何找到天数上的差异? (换句话说,我想找到当前日期-yyyy / mm / dd格式化日期之间的差异) 问题答案: 并不是真正可靠的方法,最好使用JodaTime 这是一个近似