VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DATEDIFF

功能描述

Vastbase G100在SQL Server兼容模式下支持DATEDIFF函数,用于计算两个日期之间的时间间隔。函数返回指定startdate和enddate之间所跨的指定datepart边界的计数(作为带符号整数值),返回值类型为integer类型。

语法格式

datediff(depart,startdate,enddate)

参数说明

  • depart

    enddate与startdate之间的间隔差值单位。

    取值范围:depart值不能在变量中指定,也不能指定为如'month'这样带引号的字符串。DATEDIFF接受所有有效的depart全名或全名缩写,其中在表1中列出了所有有效的depart值。

    表1 有效的depart值

    日期部分 缩写 备注
    year yy,yyyy
    quater qq,q 季度
    month mm,m
    dayofyear dy,y 一年中的第几天
    day dd,d
    week wk,ww 一年中的第几周
    weekday dw日期部分返回对应于星期中的某天的数,w
    例如:Sunday=1
    星期几
    hour hh 小时
    minute mi,n 分种
    second ss,s
    millisecond ms 毫秒
    microsecond mcs 微秒
    nanosecond ns 纳秒

  • startdate

    起始日期。

    可以解析为以下之一的表达式:time、timetz、date、timestamp、timestamptz。

  • enddate

    终止日期。

    可以解析为以下之一的表达式:time、timetz、date、timestamp、timestamptz。

注意事项

  • 本特性仅在数据库兼容模式为SQL Server时能够使用(即创建DB时DBCOMPATIBILITY='MSSQL'),在其他数据库兼容模式下不能使用该特性。
  • 若返回值超出范围(-2,147,483,648到+2,147,483,647),DATEDIFF函数返回错误。
    • 对于指定depart值为millisecond的DATEDIFF函数,startdate和enddate之间的最大差值为24天20小时31分钟23.647秒。
    • 对于指定depart值为second的DATEDIFF函数,startdate和enddate的最大差值为68年19天3小时14分7秒。
  • Vastbase的时间精度只到微秒级别,纳秒部分的值将四舍五入进入微秒部分。

示例

前置条件:创建兼容SQL Server的库db_sqlserver,并进入。

create database db_sqlserver dbcompatibility  'MSSQL';
\c db_sqlserver

示例1:depart输入为year时直接使用datediff函数。

1、查询当enddate比startdate小的情况。

select datediff(year,'2023-12-31 23:59:59','2023-01-01 00:00:00'); 

查询结果为0年:

 datediff_mssql
----------------
              0
(1 row)

2、查询当enddate比start大的情况。

select datediff(year,'2023-12-31 23:59:59','2024-01-01 00:00:00');

查询结果为enddate与startdate差值,即1年:

 datediff_mssql
----------------
              1
(1 row)

示例2:在测试表中使用以ss为depart输入的datediff函数。

1、创建测试表,并插入数据。

CREATE TABLE t_datediff_second(
c1 int,
c2 time,
c3 timetz,
c4 date,
c5 timestamp,
c6 timestamptz
)partition by list(c4)
(partition p1 values('0001-01-01'),
partition p2 values('2023-02-09'),
partition p3 values(default));

INSERT INTO t_datediff_second VALUES(1,'2001-01-01 00:00:00+00'::time,'2001-01-01 00:00:00+00'::timetz,'2001-01-01 00:00:00+00','2001-01-01 00:00:00+00','2001-01-01 00:00:00+00'); 
INSERT INTO t_datediff_second VALUES(2,'2030-12-31 23:59:59+08','2030-12-31 23:59:59+08','2030-12-31 23:59:59+08','2030-12-31 23:59:59+08','2030-12-31 23:59:59+08'); 
INSERT INTO t_datediff_second VALUES(3,'2023-02-09 10:04:00+08','2023-02-09 10:04:00+08','2023-02-09 10:04:00+08','2023-02-09 10:04:00+08','2023-02-09 10:04:00+08'); 

2、在SELECT的语句中使用DATEDIFF函数(函数以ss作为depart输入)。

select
datediff(ss,A.c2,B.c2),datediff(ss,A.c3,B.c3),datediff(ss,A.c4,B.c4),datediff(ss,A.c5,B.c5),datediff(ss,A.c6,B.c6) 
FROM t_datediff_second A LEFT JOIN t_datediff_second B 
ON A.c1=B.c1+1
WHERE B.c1 is not null;

查询结果如下:

datediff_mssql | datediff_mssql | datediff_mssql | datediff_mssql | datediff_mssql
---------------+----------------+----------------+----------------+------------
         50159 |          50159 |      249004800 |      249054959 |      249054959
             1 |         -57599 |     -946598400 |     -946684799 |     -946655999
(2 rows)