转至: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";