您的位置:首页 > 数据库

SQL日期查询中的典型问题

2008-11-29 14:54 489 查看
 典型问题:
数据表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";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql 数据库 string c# 语言