检查SQL datetime转换中的相等性

时间:2011-04-14 07:23:11

标签: sql sql-server tsql

嗨我在sql查询中转换datetime时遇到了一个奇怪的问题

select * from employee where (CONVERT(VARCHAR(10), doj , 110) 
>= '01/01/2008') 

我正在获得结果,但是对于类似的查询:

select * from employee where (CONVERT(VARCHAR(10), doj , 110) 
<= '01/01/2010') 

我没有得到结果

任何具体原因?

4 个答案:

答案 0 :(得分:3)

将字符串转换为日期时间而不是将日期时间转换为字符串将解决您的问题

select * from employee where  doj  
<=  convert(dateteime,'01/01/2010',110)

答案 1 :(得分:3)

比较select语句中datetime列的值会有点棘手。检查结果,您会注意到日期时间值包括时间“mm / dd / yyyy hh:mm:ss”,并且您将查询与此“mm / dd / yyyy”进行比较,这主要是大多数时候的原因具有相同日期的查询不会按预期方式返回。

所以,如果你有这个

column1  |  dateTimeColumn2
abc      |  01/24/2011 04:05:00

,您的查询就是这个

declare @param as datetime
set @param = '01/24/2011'

select * from table where dateTimeColumn = '01/24/2011'  
-- This would not return any because '01/24/2011' is written as '01/24/2011 00:00:00'

在您的代码中,最好的办法是

Select * 
from employee 
where Cast(Convert(varchar(25),doj,101) as Datetime) = Cast(Covert(varchar(25),parameter1,101) as datetime) 
--this will return a result

答案 2 :(得分:2)

我认为你在查询中所做的是字符串比较而不是日期比较。

假设doj是日期时间,其值为01/02/2008。

在您的查询中,条件检查将是 where ('01/02/2008' <= '01/01/2010')

因为它是字符串比较,所以它会给出错误。并且记录不会出现在结果中。

实际上你可以在mssql中执行此操作:
select * from employee where doj>='01/01/2008'
select * from employee where doj<='01/01/2010'

答案 3 :(得分:2)

如果您需要在字符串表示中包含日期,我建议始终使用ISO-8601 formatYYYYMMDD),因为它适用于所有系统,无论语言环境/语言/区域/日期格式设置。

另外,如果您的专栏dojDATETIME - 为什么甚至将其转换为比较?

为什么不使用

WHERE doj >= '20080101' 
WHERE doj <= '20100101' 

没有转换,没有混乱......