如何解决检查SQL日期时间转换中的相等性
|| 嗨,我在sql查询中转换datetime时遇到了一个奇怪的问题select * from employee where (CONVERT(VARCHAR(10),doj,110)
>= \'01/01/2008\')
我正在获取结果,但是对于类似的查询:
select * from employee where (CONVERT(VARCHAR(10),110)
<= \'01/01/2010\')
我没有结果
有什么具体原因吗?
解决方法
将您的字符串转换为datetime而不是将datetime转换为string将解决您的问题
select * from employee where doj
<= convert(dateteime,\'01/01/2010\',110)
,比较select语句中datetime列的值会有些棘手。检查结果,您会发现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
,我认为您在查询中所做的是字符串比较而不是日期比较。
假设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\'
,如果您需要用字符串表示的日期,我建议始终使用ISO-8601格式(YYYYMMDD
),因为它适用于所有系统,而与语言环境/语言/区域/日期格式设置无关。
另外,如果您的列doj
是DATETIME
-为什么还要将其转换以进行比较?
为什么不使用
WHERE doj >= \'20080101\'
WHERE doj <= \'20100101\'
没有转换,没有混乱.....
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。