Microsoft SQL Server - 打开查询,其中>日期

时间:2017-03-13 11:00:21

标签: sql-server openquery

我正在尝试使用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>中的用户中选择id,name “2017年1月1日”
  字段'LastModifiedDate'的过滤条件值必须是dateTime类型,不应该用引号括起来。“

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

有人可以就此提出建议吗?

2 个答案:

答案 0 :(得分:1)

看起来您正在查询不是标准SQL Server的链接服务器,而是使用具有specific format for date and datetime literals的SOQL的Salesforce。 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') 

答案 1 :(得分:0)

我们在这里使用了大量的Open查询,我们偶然发现了这种情况。我们过去所做的是:

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

OR

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

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

另外,要仔细检查查询是否正确,我们将查询文本分配给变量,然后我们使用print来显示变量,该print只是简单的文本,将显示在Message选项卡旁边您的结果集选项卡。只要Where子句只显示两个单引号,您所拥有的查询就应该有效,只要有疑问,请复制邮件并通过将所有加倍的单引号替换为单引号单独运行它。

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

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