【问题标题】:Add a day to a date in Postgres and SQL Server在 Postgres 和 SQL Server 中为日期添加一天
【发布时间】:2021-07-05 10:36:09
【问题描述】:

我正在寻找一种在 Postgres 和 SQL Server 中为日期添加日期的方法,因此我不必添加 if 条件来检查服务器正在运行的数据库

DATEADD(day, 1, STOP_DATE) 

不适用于 PostgreSQL &

STOP_DATE + 1 

在 sql server 中不起作用

【问题讨论】:

  • SQL 的每一种方言都是不同的,您不应该期望为一个 RDBMS 编写的 SQL 可以为另一个 RDBMS 工作。他们的次数很少,通常使用非常简单的语法。甚至 ANSI-SQL 也不总是可移植的,因为不同的 RDBMS 并不支持它的所有部分;而且通常不是相同的部分。
  • 就像我们都说过的,为您正在使用的 RDBMS 编写定制 SQL,@Laurens。如果您有多个环境,使用不同的 RDBMS,那么您需要使用应用程序中的设置来确保您使用正确的 SQL 语句。
  • 是的,但date + interval 的类型必须始终相同。你和我@Lamu 都知道在添加一整天时简化事情是明智的,但类型规则并不是那么微妙。
  • 您应该创建自己的自定义函数 AddDay,它在 Postgre 或 SQL Server 中的实现方式不同,但允许您在两者上使用相同的 SQL。
  • dateinterval 也是两种不同的数据类型。

标签: sql sql-server postgresql sql-server-2017


【解决方案1】:

总的来说,尝试使用 SQL Server 和 Postgres 上通用的语法编写 SQL 代码并不是一个好主意。您严重限制了自己,迟早会遇到运行速度太慢的查询,因为它不使用特定于某个 DBMS 的语法。

例如,在您的方法中,您人为地拒绝使用横向连接,因为它们的语法在 Postgres (LATERAL JOIN) 和 SQL Server (CROSS/OUTER APPLY) 中不同。


回到你的问题。

您可以将整数值添加到 Postgres 中的 date 值和 SQL Server 中的 datetime 值。

SQL 服务器

CREATE TABLE T(d datetime);

INSERT INTO T VALUES ('2020-01-01');

SELECT
  d, d+1 AS NextDay
FROM T

http://sqlfiddle.com/#!18/d519d9/1

这将适用于 SQL Server 中的 datedatetime2 数据类型,仅适用于 datetime

Postgres

CREATE TABLE T(d date);

INSERT INTO T VALUES ('2020-01-01');

SELECT
  d, d+1 AS NextDay
FROM T

http://sqlfiddle.com/#!17/b9670/2

我不知道它是否适用于其他数据类型。

【讨论】:

    【解决方案2】:

    在 PostgreSQL 中定义一个与 sql server 函数类似的函数。

    编辑:

    一天都过不去

    在每个数据库系统上创建一个具有相同名称的函数,相应地添加一天。

    【讨论】:

    • 不可能,因为您不能将day 作为参数传递。只有'day'(一个字符串)
    • 然后做2个函数,每个数据库系统一个
    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多