Microsoft SQL 服务器 - 打开查询 > 日期

Microsoft SQL Server - Open Query where > date

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

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

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

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

示例:

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

这returns一个错误:

INVALID_FIELD:
select id, name from Users where LastModifiedDate > '2017-01-01'
value of filter criterion for field 'LastModifiedDate' must be of type dateTime and should not be enclosed in quotes".

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

有人可以就此给我一些建议吗?

您正在查询的链接服务器似乎不是标准 SQL 服务器,而是使用具有 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') 

我们在这里使用了很多 Open 查询,我们无意中遇到了这种情况。我们过去所做的是这样的:

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''