SQL日期查询中的典型问题

 典型问题:
数据表news中有id,title,adddate等字段,并且拥有2005年6月1日至30日数据,每天都有记录,但我在用以下SQL语言句查询时,发现问题:   
  sql查询语句为:select   *   from   news   where   adddate>='2005-6-16'   and   adddate   <='2005-6-17'时,返回的结果只有2005-6-16的记录,却没有2005-6-17的记录;  
原因:DateTime型含有时:分:秒数值
  select   *   from   news   where   adddate>='2005-6-16'   and   adddate   <='2005-6-17'  
  在默认情况下等于  
  select   *   from   news   where   adddate>='2005-6-16   00:00:00'   and   adddate   <='2005-6-17   00:00:00'  
  如果只指定日期,则时间默认为 12:00   AM(午夜)。
解决:
 应该这样查询   
     select   *   from   news   where   adddate>='2005-6-16   00:00:00'   and   adddate   <='2005-6-17   23:59:59'  
  或者   
     select   *   from   news   where   convert(varchar(10),adddate,120)>='2005-6-16'   and   convert(varchar(10),adddate,120)<='2005-6-17'  
  或者  
  select   *   from   news   where   convert(varchar(10),adddate,120)   between   '2005-6-16' and '2005-6-17'  

典型问题:
SELECT * FROM Orders WHERE (OrderDate BETWEEN '1996 - 8 - 1' AND '1996 - 8 - 10')
如果OrderDate是DateTime类型,则结果正确;如果是char类型(有些数据库会用程序将 DateTime类型数据转换成yyyy-MM-dd格式的char类型保存到数据库中)则不正确.
必须保证日和月都为2位,不足者在前面加0,查询如下,可得正确结果:
SELECT *
FROM AtdRecord
WHERE (RecDate BETWEEN '2008-11-01' AND '2008-11-30')

在C#中可用如下方法构造查询字符串

DateTime dateS = dtpS.Value.Date,dateE=dtpE.Value.Date; // dtpS为时间控件dateTimepicker
            string sqlstr = "select * from AtdRecord WHERE (RecDate BETWEEN '" + dateS.ToString("u").Substring(0, 10) + "' AND '" + dateE.ToString("u").Substring(0, 10) + "') ORDER BY RecDate";

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值