我们有一个要求,我们需要比较日期和SQL服务器中的时间,以在该时间间隔内获取特定记录。
下面是我正在尝试但没有得到预期结果的示例代码 -
SELECT [VESSEL_ID], [PARTY_ID], [LAST_UPDATE_DATE]
FROM [dbo].[VS_VESSEL_PARTY_DETAILS]
WHERE [VESSEL_ID] = 19125 AND LAST_UPDATE_DATE >= Convert(datetime, '2018-12-17 13:21:02.710') AND LAST_UPDATE_DATE <= Convert(datetime, '2018-12-17 18:21:02.710') AND [END_DATE] IS NULL ORDER BY LAST_UPDATE_DATE DESC
在上面的示例中,我希望在特定时间间隔内获取所有记录。
有人可以帮助我更正此查询或提出更好的解决方案吗?
谢谢-Sameer
试试这个。之间应该有帮助,都在括号里。
SELECT [VESSEL_ID], [PARTY_ID], [LAST_UPDATE_DATE]
FROM [dbo].[VS_VESSEL_PARTY_DETAILS]
WHERE [VESSEL_ID] = 19125
AND LAST_UPDATE_DATE between( Convert(datetime, '2018-12-17 13:21:02.710')
AND Convert(datetime, '2018-12-17 18:21:02.710') )
AND [END_DATE] IS NULL ORDER BY LAST_UPDATE_DATE DESC
这是您的查询:
SELECT [VESSEL_ID], [PARTY_ID], [LAST_UPDATE_DATE]
FROM [dbo].[VS_VESSEL_PARTY_DETAILS]
WHERE [VESSEL_ID] = 19125 AND
LAST_UPDATE_DATE >= Convert(datetime, '2018-12-17 13:21:02.710') AND
LAST_UPDATE_DATE <= Convert(datetime, '2018-12-17 18:21:02.710') AND
[END_DATE] IS NULL
ORDER BY LAST_UPDATE_DATE DESC;
查询没有任何问题。 如果未收到任何行,则没有行与 WHERE
子句中的条件匹配。
当您将LAST_UPDATE_DATE与less_than_or_equal进行比较并同时greater_than_or_equal相同的值时,最终它等价于简单相等。
所以你的陈述应该是这样的:
SELECT [VESSEL_ID], [PARTY_ID], [LAST_UPDATE_DATE]
FROM [dbo].[VS_VESSEL_PARTY_DETAILS]
WHERE [VESSEL_ID] = 19125 AND LAST_UPDATE_DATE = Convert(datetime, '2018-12-17 13:21:02.710')
ORDER BY LAST_UPDATE_DATE DESC
但是,由于您可能不知道精确到毫秒的确切时间,因此您可能需要使用一系列略有不同的值。
DECLARE @DateFrom DATETIME = Convert(datetime, '2018-12-17 13:21:02.700')
DECLARE @DateTo DATETIME = Convert(datetime, '2018-12-17 13:21:02.720')
-- note that above times are 20ms apart
SELECT [VESSEL_ID], [PARTY_ID], [LAST_UPDATE_DATE]
FROM [dbo].[VS_VESSEL_PARTY_DETAILS]
WHERE [VESSEL_ID] = 19125 AND LAST_UPDATE_DATE BETWEEN @DayFrom AND @DayTo
ORDER BY LAST_UPDATE_DATE DESC
顺便说一句,最好从 SELECT 语句中取出任何静态值计算,这样它就不会在每一行上计算它。