【问题标题】:NUMTODSINTERVAL in PostgreSQLPostgreSQL 中的 NUMTODSINTERVAL
【发布时间】:2014-07-28 13:16:39
【问题描述】:

PostgreSQL中是否有与OracleNUMTODSINTERVAL(n, interval unit)相同的函数?

【问题讨论】:

  • 对于我们这些不知情的人,NUMTODSINTERVAL做了什么?您想通过使用它来解决什么问题?对于输入,您期望什么输出? (如果我问你“有没有相当于 to_tsvector 的 Oracle”,你会说什么?)
  • 我想获得像 INTERVAL '1 day' 这样的间隔,但在我的情况下,编号是可变的

标签: sql oracle postgresql


【解决方案1】:

只需将您的变量乘以所需的间隔:

interval '1' day * n

从 Postgres 9.4 开始你也可以使用函数make_interval()

make_interval(days => n)

【讨论】:

  • 这应该是公认的答案。乘法比串联 + 转换更便宜,更不容易出错。等效语法:interval '1 day' * n
  • @ErwinBrandstetter 确实如此,但如果单位是变量/列值怎么办?不能这样表达。但是当然,如​​果单位是常数,乘法是更好的解决方案。
  • @ErwinBrandstetter:请注意,interval '1' day 是 SQL 标准中为间隔指定的语法。 interval '1 day' 是 Postgres 的扩展。
  • @pozs:它适用于来自列的所有值。单位将是 interval '1' day 等。
  • @ErwinBrandstetter 是的,但事实并非如此 (stackoverflow.com/questions/24996162/…) - 如此有效地解决方案需要连接和乘法 - 或重新设计架构,但这种情况下两列可以合并为一个区间。
【解决方案2】:

如果你想要一个类似于this 函数的功能(即单位是可变的——不是恒定的):在 PostgreSQL 中一个简单的连接和强制转换就足够了:

select cast(num || unit as interval)

SQLFiddle

你可以阅读更多关于interval的输入格式here

【讨论】:

  • 谢谢!我最终得到了一个 SQL 函数:emanuel=# CREATE OR REPLACE FUNCTION numtoyminterval(num integer, unit varchar) RETURNS interval IMMUTABLE LANGUAGE sql AS $$ SELECT cast(num || unit as interval) $$ ; select numtoyminterval(2,'day'); -- 2 days 它比interval '1' day * n 性能更高,但是使用强制转换更容易更改单位。
【解决方案3】:

'1 day'::interval 做这样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2016-05-09
    • 2011-04-26
    • 2022-01-01
    • 2012-08-16
    • 2017-05-06
    相关资源
    最近更新 更多