1

我正在将一些 T-SQL 存储过程移植到 PL/pgSql,并且对 PostgreSQL 来说非常陌生,不知道 pg 社区中可能提供哪些有用的实用程序功能。是否有一套“几乎每个人都在使用”的强大的日期数学函数?如果那里已经有一个很棒的包,我不想快速拼凑一些日期数学函数。

如果您正在键入查询并且碰巧知道间隔,那么带有“自然语言”字符串字面量参数的 PostgreSQL 日期数学运算符是用户友好的:

      select now() - interval '1 day'

但如果间隔1是涉及嵌套 date-math 函数调用的计算结果,那么这些字符串文字实际上根本不是非常用户友好,使用 date_add 函数会更容易:

      select dateadd(d, {calculation that returns the interval}, now() )

谢谢

4

3 回答 3

0

您正在谈论的“自然语言”字符串是区间文字。间隔也可以通过使用日期算术获得。

当然 dateadd 可以很简单地在 Postgresql 中模拟如下:

select d + ({计算返回间隔}::text || 'day')::interval

根据需要替换“月”或“小时”等。

于 2013-01-30T13:29:51.817 回答
0

让我给你举个例子。我想从任意日期减去自 1970 年 1 月 1 日以来经过的月数,然后将该月数添加到 1970 年 1 月 1 日,以返回任意日期所在月份的第一天

select (date_trunc('month', '2013-01-30'::date))::date

或者在这个月的第一天加上一个月得到下个月的第一天,然后减去一天得到这个月的最后一天

select date_trunc('month', '2013-01-30'::date + 1 * interval '1 month')::date - 1

请注意,在上面的示例中,您可以通过将 乘以interval '1 month'整数来添加任意数量的月份。您可以在任何时间间隔内执行此操作,而无需操作字符串'1 month'。因此,要添加或减去任何间隔,您只需:

select current_date + 5 * interval '1 month'

不需要凌乱的字符串操作。您也可以乘以分数:

select current_timestamp + 3.5 * interval '1 minute'

要为date类型添加或减去天数,请使用整数:

select current_date + 10
于 2013-01-30T13:37:36.050 回答
0

在 PostgreSQL 中,您只需在日期时间值中添加和减去间隔值:

'2001-06-27 14:43:21'::TIMESTAMP - '00:10:00'::INTERVAL = '2001-06-27 14:33:21'::TIMESTAMP
'2001-06-27 14:43:21'::TIMESTAMP- '2001-06-27 14:33:21'::TIMESTAMP = '00:10:00'::INTERVAL

有关更多信息,请参阅PostgreSQL 在线文档中的“函数和运算符”

要计算日期月份的第一天:date_trunc('month', date)

下个月的第一天:date_trunc('month', date) + '1 month'::INTERVAL

在该日期的月份的第一天加上三个月:date_trunc('month', date) + 3*('1 month'::INTERVAL)

间隔是一种数据类型,而不是字符串,您可以使用它的值进行计算。

于 2013-01-30T13:18:05.263 回答