SQL Server 2005查询查找在5小时内插入的记录

时间:2013-08-13 19:11:50

标签: sql sql-server sql-server-2005

我有一个varcharmytime,我用它来存储时间

现在我想找出所有在5小时内插入的记录。

e.g。

Select *
from mytable
where **mytime + interval '5' hour > current_Time**

1 个答案:

答案 0 :(得分:4)

由于如果有人在列中填充了'floob''32:45',那么隐式转换为datetime可能会失败 - 因为他们知道这是错误的数据类型 - 您需要处理该案例和处理任何在那里悄悄出现的不良数据。您还需要将时间值标准化为同一日期,因为没有日期的时间将具有1900-01-01的日期组件,但是涉及从GETDATE()添加/减去小时的任何内容都将具有今天日期的日期组件。所以你需要这样的东西来处理所有这些(这假设你的时间只是12:32而不是12:32.000或包含AM / PM):

-- first, get a variable to hold 5 hours ago on 1900-01-01:

DECLARE @cutoff DATETIME;
SET @cutoff = DATEADD(DAY,-DATEDIFF(DAY,0,GETDATE()),DATEADD(HOUR,-5,GETDATE()));

-- now use that in the WHERE clause
-- and also check that the value can be converted
-- to a date and it is in hh:mm format.

-- need CASE expression here because you can't
-- control the order in which WHERE clauses are
-- evaluated by SQL Server.

SELECT ... WHERE
CASE 
  WHEN ISDATE(MyTime) = 1 
  AND MyTime LIKE '[ 0-2][0-6]:[0-6][0-9]'
THEN CONVERT(DATETIME, MyTime) END > @cutoff;

在SQL Server 2008及更高版本中,您可以使用TIME数据类型,因此您无需担心合并日期。在SQL Server 2012及更高版本中,您可以使用TRY_CONVERT来避免所有混乱的CASE逻辑。

真正的答案:修复列并使用正确的数据类型。绝对没有理由将时间数据存储在字符串列中。然后你可以说:

WHERE MyTime > @cutoff;

在这种情况下,您实际上可能会有机会寻找索引,而不是扫描整个表格。