检测早于' X'小时SQL

时间:2017-05-10 11:07:07

标签: sql sql-server-2008

我有一个表,其中包含两个单独列中记录的创建日期和创建时间。

SELECT
T0.[ID] AS ' ID',
T0.[customer] AS 'Customer Name',
T0.[status] AS 'Status',
T0.[createDate] AS 'Creation Date',
T0.[createTime] AS 'Creation Time' 

FROM

[ret].[MRCL] T0

WHERE

T0.[status] Like N'%-3%'

创建日期存储为DATE,例如

10.05.17
09.03.17

由于某种原因(我无法控制)的时间存储为(-32,768到:32,767)之间的数字,例如

15:20
10:56
09:25

我正在寻找一种方法来过滤掉超过' 2'小时。

1 个答案:

答案 0 :(得分:0)

这很痛苦,但是对于SARGable利用任何可用索引的东西,我们可以创建参数来满足标准,而不是将表列转换为实际有意义的东西。

使用convert()个样式和replace()生成表格中使用的smallint时间格式:

declare @hoursbefore int = 16;
declare @beforeDate date = convert(date,dateadd(hour,-@hoursbefore,getdate()));
declare @beforeTimeSmallint smallint = convert(smallint,replace(convert(char(5),dateadd(hour,-@hoursbefore,getdate()),108),':',''));

并像这样使用:

select *
from t
where t.[status] like N'%-3%'
  and ( CreateDate < @beforeDate 
    or (CreateDate = @beforeDate and CreateTime < @beforeTimeSmallint)
    )

转换细分:

declare @beforeTimeSmallint smallint =
  convert(smallint
    ,replace(
      convert(char(5)
        ,dateadd(hour,-@hoursbefore,getdate()) /* reduce current date by amount of hours */
        ,108 /* time as hh:mi:ss */  )
      ,':','') /* replacing the semicolon */
      );