【问题标题】:Microsoft SQL Server - Open Query where > dateMicrosoft SQL Server - 打开查询 > 日期
【发布时间】:2017-03-13 11:00:21
【问题描述】:

我正在尝试使用openquery 运行选择并按日期过滤结果,但我在使用 where 子句之后的日期时遇到问题。

理想情况下我希望能够传递一个变量

set @d = dateadd(day, -30, getdate())

但为了举例,我会尝试使用指定的日期:

例子:

select * 
from OPENQUERY([Linked_Server], 'select id, name from Users where LastModifiedDate > ''2017-01-01''') 

这会返回一个错误:

INVALID_FIELD:
从 LastModifiedDate > '2017-01-01' 的用户中选择 ID、名称
字段“LastModifiedDate”的过滤条件值必须是 dateTime 类型,并且不应包含在引号中。

如果我使用例如istrue = true,它可以正常工作,但比较日期似乎是个问题。

有人可以给我建议吗?

【问题讨论】:

    标签: sql-server openquery


    【解决方案1】:

    您查询的链接服务器似乎不是标准 SQL Server,而是使用 SOQL 的 Salesforce,该服务器具有 specific format for date and datetime literals。 Salesforce 中日期过滤器的正确格式是:

    WHERE LastModifiedDate > 2017-01-01T00:00:00Z
    

    所以你的完整 SQL 应该是:

    SELECT *
    FROM OPENQUERY(
        [Linked_Server],
        'SELECT id, name FROM Users WHERE LastModifiedDate > 2017-01-01T00:00:00Z') 
    

    【讨论】:

    • 是的,我正在连接到 SalesForce。您的解决方案非常有效,谢谢。
    【解决方案2】:

    我们在这里使用了很多开放式查询,我们偶然发现了这种情况。我们过去所做的是这样的:

    CONVERT(VARCHAR(11),@d,101)
    

    CONVERT(VARCHAR(25),@d,126)
    

    这已经将日期转换为 DavidG 在此处发布的格式。

    此外,为了仔细检查查询是否正确输出,我们将查询文本分配给一个变量,然后我们使用打印来显示变量,该打印只是简单的文本,将显示在您的消息选项卡旁边您的结果集选项卡。只要 Where 子句仅显示两个单引号,则您的查询应该可以工作,以防万一,复制消息并通过将所有双引号替换为一个单引号单独运行它。

    我在 WHERE 子句的消息选项卡中的内容是这样的:

    WHERE thisdate BETWEEN ''02/27/2017'' AND ''2017-02-27T23:59:59.990''
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2019-12-06
      • 2018-02-14
      • 2010-11-13
      相关资源
      最近更新 更多