现在的位置: 首页 > 综合 > 正文

SQL日期查询中的典型问题

2013年10月10日 ⁄ 综合 ⁄ 共 1412字 ⁄ 字号 评论关闭

转至:http://blog.csdn.net/ltolll/article/details/3409748

 典型问题:
数据表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";

抱歉!评论已关闭.