我正在寻找一种在PostgreSQL中实现SQLServer函数datediff的方法.那是,
此函数返回指定的startdate和enddate之间交叉的指定datepart边界的计数(作为有符号整数值).
datediff(dd, '2010-04-01', '2012-03-05') = 704 // 704 changes of day in this interval
datediff(mm, '2010-04-01', '2012-03-05') = 23 // 23 changes of month
datediff(yy, '2010-04-01', '2012-03-05') = 2 // 2 changes of year
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过简单地使用减法来做'dd',但是关于其他两个的任何想法?
meh*_*hdi 109
简单地减去它们:
select '2015-01-12'::date - '2015-01-01'::date;
Run Code Online (Sandbox Code Playgroud)
这会给你:
?column?
----------
11
Run Code Online (Sandbox Code Playgroud)
Igo*_*nko 96
尝试类似的东西:
select age('2010-04-01', '2012-03-05'),
date_part('year',age('2010-04-01', '2012-03-05')),
date_part('month',age('2010-04-01', '2012-03-05')),
date_part('day',age('2010-04-01', '2012-03-05'));
Run Code Online (Sandbox Code Playgroud)
此功能将为您提供两个日期之间的完整年,月,日.... 对于更改日期的数量 - 我们链接,由revoua提供:http://www.sqlines.com/postgresql/how-to/datediff
Web*_*rer 36
我花了一些时间寻找最好的答案,我想我有它.
这个sql会给你两个日期之间的天数integer:
SELECT
(EXTRACT(epoch from age('2017-6-15', now())) / 86400)::int
Run Code Online (Sandbox Code Playgroud)
..which,今天运行时(2017-3-28),为我提供:
?column?
------------
77
Run Code Online (Sandbox Code Playgroud)
对接受的答案的误解:
select age('2010-04-01', '2012-03-05'),
date_part('year',age('2010-04-01', '2012-03-05')),
date_part('month',age('2010-04-01', '2012-03-05')),
date_part('day',age('2010-04-01', '2012-03-05'));
Run Code Online (Sandbox Code Playgroud)
..你将获得日期字符串部分之间的字面差异,而不是两个日期之间的时间量.
IE:
Age(interval)=-1 years -11 mons -4 days;
Years(double precision)=-1;
Months(double precision)=-11;
Days(double precision)=-4;
几乎与您需要的功能相同(基于atiruz的答案,从这里缩短版本的UDF )
CREATE OR REPLACE FUNCTION datediff(type VARCHAR, date_from DATE, date_to DATE) RETURNS INTEGER LANGUAGE plpgsql
AS
$$
DECLARE age INTERVAL;
BEGIN
CASE type
WHEN 'year' THEN
RETURN date_part('year', date_to) - date_part('year', date_from);
WHEN 'month' THEN
age := age(date_to, date_from);
RETURN date_part('year', age) * 12 + date_part('month', age);
ELSE
RETURN (date_to - date_from)::int;
END CASE;
END;
$$;
Run Code Online (Sandbox Code Playgroud)
用法:
/* Get months count between two dates */
SELECT datediff('month', '2015-02-14'::date, '2016-01-03'::date);
/* Result: 10 */
/* Get years count between two dates */
SELECT datediff('year', '2015-02-14'::date, '2016-01-03'::date);
/* Result: 1 */
/* Get days count between two dates */
SELECT datediff('day', '2015-02-14'::date, '2016-01-03'::date);
/* Result: 323 */
/* Get months count between specified and current date */
SELECT datediff('month', '2015-02-14'::date, NOW()::date);
/* Result: 47 */
Run Code Online (Sandbox Code Playgroud)
SELECT date_part ('year', f) * 12
+ date_part ('month', f)
FROM age ('2015-06-12'::DATE, '2014-12-01'::DATE) f
Run Code Online (Sandbox Code Playgroud)
结果:6
@WebWanderer 的答案非常接近使用 SQL Server 的 DateDiff,但不准确。这是因为使用了age()函数。
例如,“2019-07-29”和“2020-06-25”之间的天数应返回 332,但是,使用age()函数它将返回 327。因为age()返回“10 mons 27 days”并且它对待每个月为 30 天,这是不正确的。
您应该使用时间戳来获得准确的结果。例如
ceil((select extract(epoch from (current_date::timestamp - <your_date>::timestamp)) / 86400))
| 归档时间: |
|
| 查看次数: |
136436 次 |
| 最近记录: |