【问题标题】:Querying Oracle through SQL Server linked server and date values通过 SQL Server 链接服务器和日期值查询 Oracle
【发布时间】:2016-09-02 16:26:36
【问题描述】:

我正在尝试访问作为“链接服务器”连接到 SQL Server 的旧 Oracle DB 中的一些数据。我有一个 Oracle 表,其中一列是 Date 类型。此列中的值可以为 NULL。

在我正在构建的查询中,如果值为 NULL,我希望仅返回列值的“日期”部分或空字符串。

我目前正在尝试:

  CASE
     WHEN ACCOUNT.DATE_REVOKED IS NULL
     THEN ''
     ELSE CONVERT(DATE, ACCOUNT.DATE_REVOKED)
  END

这适用于具有实际日期的值。对于 NULL 值,返回“1900/01/01”。如果我不使用CASE 并且只返回

的结果
    CONVERT(DATE, ACCOUNT.DATE_REVOKED)

至少在 SQL Server Management Studio 中,我会得到日期部分或文本“NULL”。

我错过了什么?

【问题讨论】:

  • 如果您的目标日期列是 DATE 类型,那么它将允许有效日期或 NULL 值存储。您不能在 DATE 数据类型列中存储 ''(空白)。如果您希望将 '' 空白存储在其中,则必须将列的数据类型更改为 VARCHAR()。
  • 正如@SagarShelke 所说,如果你有一个日期时间,并在其中写入''(空白),最终结果是1900-01-01。 SQL Server 不会在日期时间中存储空白,但如果它可以为空,它将存储 NULL。是的,varchar 会这样做,但是为什么……那只是不好的做法;当您稍后尝试处理数据时,它会让您面临糟糕的数据和糟糕的性能,以及更多令人头疼的问题。

标签: sql-server oracle


【解决方案1】:

正如 cmets 所建议的,您不能在日期列中使用空字符串,因此,为什么不使用它呢:

CASE
    WHEN ACCOUNT.DATE_REVOKED IS NULL
    THEN NULL
    ELSE CONVERT(DATE, ACCOUNT.DATE_REVOKED)
END

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 2011-05-04
    • 2015-08-27
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多