PostgreSQL-DATEDIFF-日期时间差,以秒,天,月,周等为单位

您可以使用各种日期时间表达式或用户定义的 DATEDIFF 函数(UDF)在 PostgreSQL 中计算两个日期时间值之间的差,以秒,分钟,小时,天,周,月和年为单位。

总览

PostgreSQL 不提供类似于 SQL Server DATEDIFF 的[2] DATEDIFF 函数,但是您可以使用各种表达式或 UDF 来获得相同的结果。

SQL Server
and Sybase
PostgreSQL
Years DATEDIFF(yy, start, end) DATE_PART('year', end) - DATE_PART('year', start)
Months DATEDIFF(mm, start, end) years_diff * 12 + (DATE_PART('month', end) - DATE_PART('month', start))
Days DATEDIFF(dd, start, end) DATE_PART('day', end - start)
Weeks DATEDIFF(wk, start, end) TRUNC(DATE_PART('day', end - start)/7)
Hours DATEDIFF(hh, start, end) days_diff * 24 + DATE_PART('hour', end - start )
Minutes DATEDIFF(mi, start, end) hours_diff * 60 + DATE_PART('minute', end - start )
Seconds DATEDIFF(ss, start, end) minutes_diff * 60 + DATE_PART('minute', end - start )

PostgreSQL-年中的日期差异

考虑使用 SQL Server 函数来计算以年为单位的两个日期之间的差:

SQL Server

  -- Difference between Oct 02, 2011 and Jan 01, 2012 in yearsSELECT DATEDIFF(year, '2011-10-02', '2012-01-01');-- Result: 1

请注意,SQL Server DATEDIFF 函数返回 1 年,尽管日期之间只有 3 个月。

SQL Server 不计算日期之间经过的年,它仅计算年份之间的差异。

在 PostgreSQL 中,您可以从日期中获取年份部分并将其减去。

PostgreSQL

 -- Difference between Oct 02, 2011 and Jan 01, 2012 in yearsSELECT DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date);-- Result: 1

PostgreSQL-月中的日期差异

考虑使用 SQL Server 函数来计算两个日期(以月为单位)之间的差额:

SQL Server

  -- Difference between Oct 02, 2011 and Jan 01, 2012 in monthsSELECT DATEDIFF(month, '2011-10-02', '2012-01-01');-- Result: 3

在 PostgreSQL 中,您可以将年份之间的差值乘以 12,然后将月份部分之间的差值相加(可以为负)。

PostgreSQL

-- Difference between Oct 02, 2011 and Jan 01, 2012 in monthsSELECT (DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date)) * 12 +(DATE_PART('month', '2012-01-01'::date) - DATE_PART('month', '2011-10-02'::date));-- Result: 3

PostgreSQL-日期的天数差异

考虑使用 SQL Server 函数来计算两天之间的日期差:

SQL Server

 -- Difference between Dec 29, 2011 23:00 and Dec 31, 2011 01:00 in daysSELECT DATEDIFF(day, '2011-12-29 23:00:00', '2011-12-31 01:00:00');-- Result: 2

请注意,DATEDIFF 返回了 2 天,尽管 datetime 值之间只有 1 天 2 小时。

在 PostgreSQL 中,如果您从另一个中减去一个日期时间值(TIMESTAMP,DATE 或 TIME 数据类型),则将获得一个 INTERVAL 值,格式为“ ddd days hh:mi:ss ”。

   SELECT '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp;-- Result: "1 day 02:00:00"SELECT '2011-12-31 01:00:00'::timestamp - '2010-09-17 23:00:00'::timestamp;-- Result: "469 days 02:00:00"

所以,你可以使用 date_part 数函数 extact 的天数,但它返回的数量充分的日期之间的天数。

PostgreSQL

 -- Difference between Dec 29, 2011 23:00 and Dec 31, 2011 01:00 in daysSELECT DATE_PART('day', '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp);-- Result: 1

PostgreSQL-周中的日期差异

考虑使用 SQL Server 函数来计算两周中两个日期之间的差额:

SQL Server

-- Difference between Dec 22, 2011 and Dec 31, 2011 in weeksSELECT DATEDIFF(week, '2011-12-22', '2011-12-31');-- Result: 1

DATEDIFF 返回日期时间值之间的周数。

在 PostgreSQL 中,您可以使用表达式定义天数(请参见上文)并将其除以 7。需要 TRUNC 才能删除除后的小数部分。

PostgreSQL

  -- Difference between Dec 22, 2011 and Dec 31, 2011 in weeksSELECT TRUNC(DATE_PART('day', '2011-12-31'::timestamp - '2011-12-22'::timestamp)/7);-- Result: 1

PostgreSQL-日期时间的小时差异

考虑使用 SQL Server 函数来计算两个 datetime 值之间的时差,以小时为单位:

SQL Server

  -- Difference between Dec 30, 2011 08:55 and Dec 30, 2011 9:05 in weeksSELECT DATEDIFF(hour, '2011-12-30 08:55', '2011-12-30 09:05');-- Result: 1

请注意,尽管 datetime 值之间只有 10 分钟的差异,但 DATEDIFF 返回了 1 小时。

在 PostgreSQL 中,您可以使用表达式来定义天数(请参见上文),乘以 24 并乘以小时。

PostgreSQL

 -- Difference between Dec 30, 2011 08:55 and Dec 30, 2011 9:05 in weeksSELECT DATE_PART('day', '2011-12-30 08:55'::timestamp - '2011-12-30 09:05'::timestamp) * 24 +DATE_PART('hour', '2011-12-30 08:55'::timestamp - '2011-12-30 09:05'::timestamp);-- Result: 0

请注意,此 PostreSQL 表达式返回在 datetime 值之间传递的完整小时数。

PostgreSQL-分钟中的日期时间差异

考虑使用 SQL Server 函数以分钟为单位计算两个日期时间值之间的差:

SQL Server

  -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in minutesSELECT DATEDIFF(minute, '2011-12-30 08:54:55', '2011-12-30 08:56:10');-- Result: 2-- Time onlySELECT DATEDIFF(minute, '08:54:55', '08:56:10');-- Result: 2

请注意,尽管 datetime 值之间只有 1 分 15 秒,但 DATEDIFF 返回了 2 分钟。

在 PostgreSQL 中,您可以使用一个表达式来定义小时数(请参阅上文),乘以 60 并乘以分钟。

PostgreSQL

-- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in minutesSELECT (DATE_PART('day', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp) * 24 +DATE_PART('hour', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +DATE_PART('minute', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp);-- Result: 1-- Time onlySELECT DATE_PART('hour', '08:56:10'::time - '08:54:55'::time) * 60 +DATE_PART('minute', '08:56:10'::time - '08:54:55'::time);-- Result: 1

请注意,这些 PostreSQL 表达式返回在 datetime 值之间传递的完整分钟数。

PostgreSQL-日期时间差(以秒为单位)

考虑使用 SQL Server 函数以秒为单位计算两个日期时间值之间的差:

SQL Server

  -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in secondsSELECT DATEDIFF(second, '2011-12-30 08:54:55', '2011-12-30 08:56:10');-- Result: 75-- Time onlySELECT DATEDIFF(second, '08:54:55', '08:56:10');-- Result: 75

在 PostgreSQL 中,您可以使用表达式定义分钟数(请参见上文),乘以 60 并乘以秒。

PostgreSQL

-- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in secondsSELECT ((DATE_PART('day', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp) * 24 +DATE_PART('hour', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +DATE_PART('minute', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +DATE_PART('second', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp);-- Result: 75-- Time onlySELECT (DATE_PART('hour', '08:56:10'::time - '08:54:55'::time) * 60 +DATE_PART('minute', '08:56:10'::time - '08:54:55'::time)) * 60 +DATE_PART('second', '08:56:10'::time - '08:54:55'::time);-- Result: 75

PostgreSQL DATEDIFF-用户定义函数(UDF)

除了使用单独的表达式来计算每个时间单位的日期时间差之外,还可以使用类似于 SQL Server DATEDIFF 函数的函数。

PostgreSQL

CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)RETURNS INT AS $$DECLAREdiff_interval INTERVAL;diff INT = 0;years_diff INT = 0;BEGINIF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THENyears_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t);IF units IN ('yy', 'yyyy', 'year') THEN-- SQL Server does not count full years passed (only difference between year parts)RETURN years_diff;ELSE-- If end month is less than start month it will subtractedRETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t));END IF;END IF;-- Minus operator returns interval 'DDD days HH:MI:SS'diff_interval = end_t - start_t;diff = diff + DATE_PART('day', diff_interval);IF units IN ('wk', 'ww', 'week') THENdiff = diff/7;RETURN diff;END IF;IF units IN ('dd', 'd', 'day') THENRETURN diff;END IF;diff = diff * 24 + DATE_PART('hour', diff_interval);IF units IN ('hh', 'hour') THENRETURN diff;END IF;diff = diff * 60 + DATE_PART('minute', diff_interval);IF units IN ('mi', 'n', 'minute') THENRETURN diff;END IF;diff = diff * 60 + DATE_PART('second', diff_interval);RETURN diff;END;$$ LANGUAGE plpgsql;

如何使用 PostgreSQL DATEDIFF 函数

语法与 SQL Server DATEDIFF 相似,但是您必须在 PostgreSQL 中将时间单位(秒,分钟等及其缩写)指定为字符串文字,例如:

   -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in secondsSELECT DATEDIFF('second', '2011-12-30 08:54:55'::timestamp, '2011-12-30 08:56:10'::timestamp);-- Result: 75

PostgreSQL DATEDIFF 函数仅适用于 TIME

您可以具有另一个仅对时间数据类型起作用的函数。PostgreSQL 支持具有相同名称但参数数据类型不同的重载函数:

CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIME, end_t TIME)RETURNS INT AS $$DECLAREdiff_interval INTERVAL;diff INT = 0;BEGIN-- Minus operator for TIME returns interval 'HH:MI:SS'diff_interval = end_t - start_t;diff = DATE_PART('hour', diff_interval);IF units IN ('hh', 'hour') THENRETURN diff;END IF;diff = diff * 60 + DATE_PART('minute', diff_interval);IF units IN ('mi', 'n', 'minute') THENRETURN diff;END IF;diff = diff * 60 + DATE_PART('second', diff_interval);RETURN diff;END;$$ LANGUAGE plpgsql;

登录后复制

例如,可以将此函数调用为:

  -- Difference between 08:54:55 and 08:56:10 in secondsSELECT DATEDIFF('second', '08:54:55'::time, '08:56:10'::time);-- Result: 75

PostgreSQL 的时间差DATEDIFF相关推荐

  1. postgresql 计算时间差

    按日期计算天数差 # select (('2019-11-18 12:05'::timestamp)::date - ('2019-10-18 12:05'::timestamp)::date) as ...

  2. postgresql兼容MySQL datediff函数

    datediff函数兼容解决方案 datediff函数说明 datediff函数返回俩日期相差的天数,如 select datediff('2021-12-21 10:21:23',now()) 在p ...

  3. sqlserver计算时间差DATEDIFF 函数

    DATEDIFF 函数 [日期和时间] 功能 返回两个日期之间的间隔. 语法 DATEDIFF ( date-part, date-expression-1, date-expression-2 ) ...

  4. postgresql 计算时间差的秒数、天数

    处理时间时用到了,记录一下. 计算时间差天数 select extract(day FROM (age('2017-12-10'::date , '2017-12-01'::date))); 计算时间 ...

  5. postgresql时间差计算

    工作中使用了阿里云的数据库,语法是用的postgresql,这个语言的时间函数计算跟impala和mysql等等都不太一样.业务中需要去做时间差的时候,本来想着用timediff()之类的函数去计算, ...

  6. oracle中时间差转秒,oracle计算时间秒数差

    --计算plsql处理时间差 --qzq declare time1 timestamp; --开始时间 time2 timestamp; --结束时间 sum1 number(9); --时间差(s ...

  7. silverlight, 双击事件

    Silverlight 没有提供双击事件,所以需要通过判断两次点击的时间来模拟双击事件 下面的代码,做个参考. cellBtn.Click += new RoutedEventHandler(cell ...

  8. 处理时间_7_60个Mysql日期时间函数汇总

    Mysql日期时间函数使用大全 需求描述 需求:列出mysql常见的日期.时间函数的使用方法以及注意事项. 解决方法:通过参考官方手册并验证来完成该需求. 注:1 当前以mysql来演示. 2 详细函 ...

  9. sqlserver函数 1209

    >字符串函数 charindex 查询子字符串的位置 charindex(子字符串,总字符串) 例子: select CHARINDEX('a','banana') 返回值: 查不到,0 查到了 ...

最新文章

  1. jQuery源码-jQuery.fn.each jQuery.each
  2. centos6.5搭建lnmp环境
  3. document.execCommand()方法处理Html数据
  4. 使用uniapp开发婚庆应用的时候开发公共组件请求网络数据的方式
  5. 040 DataFrame中的write与read编程
  6. 如何在C++Builder中使用全局变量
  7. java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)
  8. spring 配置文件模板
  9. 免费持久的天气预报web service
  10. 尤金·卡巴斯基:卡巴斯基实验室调查内网遭黑客攻击事件
  11. SQL ---- 查询字段为逗号拼接的字符串
  12. 生活中的英语 —— 动植物篇
  13. 中心极限与大数定理律的关系_中心极限定理的最最通俗解释
  14. DPM 2007 BUG
  15. 蝶形算法(Butterfly Algorithm)未更完
  16. 路由器映射,端口映射?
  17. 解决excel转pdf出现的折行问题
  18. Notification使用举例
  19. 养成良好的编程习惯-一个库一个文件夹
  20. 分析各渠道广告,建立评分模型以及找到优质渠道的特性

热门文章

  1. CSDN设置私密文章
  2. 伍德里奇---计量经济学第6章部分计算机习题详解(stata),伍德里奇---计量经济学第6章部分计算机习题详解(STATA)...
  3. 唯品会魔方罗盘数据全自动爬虫
  4. 第十届Flash开发者大会-深圳
  5. 搭建AI智能语音外呼系统
  6. 希腊字母的 LaTeX 语言、音标、大小写、以及对应的真实读音
  7. 侠盗猎车手5 MOD版/Grand Theft Auto V/gta5
  8. 科妹家的员工表彰会来了!超燃!
  9. 数据安全-密码学常用技术(一)
  10. vue2简单实现一个传送门的效果