我正在尝试使用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
,它可以正常工作,但比较日期似乎是个问题。
有人可以就此提出建议吗?
答案 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''