发现SQL Server惊天大秘密!!

本文探讨了SQLServer中使用不同方式对日期进行筛选时出现的意外结果。通过对比直接SQL语句与存储过程参数传递的方式,揭示了数据类型转换对查询结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文: 发现SQL Server惊天大秘密!!

-- set statistics xml on
CREATE  TABLE T_TEST(ID  INT  IDENTITY  PRIMARY  KEY,CreateTime DATE)
INSERT  INTO T_TEST  SELECT  ' 2011-11-04 '
UNION  ALL  SELECT  ' 2011-11-04 '
UNION  ALL  SELECT  ' 2011-11-04 '
UNION  ALL  SELECT  ' 2011-11-05 '
UNION  ALL  SELECT  ' 2011-11-05 '
UNION  ALL  SELECT  ' 2011-11-05 '

SELECT  *  FROM T_TEST

SELECT  COUNT( *FROM T_TEST 
WHERE CreateTime >= ' 2011-11-04 00:00:00 '  AND CreateTime  <= ' 2011-11-04 23:59:59 '
-- 等价于(返回3行,这个没有问题)
SELECT  COUNT( *FROM T_TEST 
WHERE CreateTime = ' 2011-11-04 '


SELECT  COUNT( *FROM T_TEST 
WHERE CreateTime >= ' 2011-11-04 00:00:00 '  AND CreateTime  < ' 2011-11-04 23:59:59 '
-- 等价于(返回0行,因为where条件无意义,这个也没有问题)
SELECT  COUNT( *FROM T_TEST 
WHERE CreateTime >= ' 2011-11-04 '  AND CreateTime  < ' 2011-11-04 '


-- 传入参数为datetime类型(它为什么能返回3行?!!!!这是为什么!!)
SP_executesql N '
    select COUNT(*) 
    from T_TEST
    where CreateTime>=@BeginTime and CreateTime<@EndTime
',N ' @BeginTime datetime,@EndTime datetime ',
@BeginTime = ' 2011-11-04 00:00:00 ',
@EndTime = ' 2011-11-04 23:59:59 '    

-- 修改了传参类型为date类型(返回0行)
SP_executesql N '
    select COUNT(*) 
    from T_TEST
    where CreateTime>=@BeginTime and CreateTime<@EndTime
',N ' @BeginTime date,@EndTime date ',
@BeginTime = ' 2011-11-04 00:00:00 ',
@EndTime = ' 2011-11-04 23:59:59 '    
posted on 2014-03-12 14:11 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3596242.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值