我试图根据当前日期和当前时间前15分钟从表Paper_Details
中获取信息。
这是我的SELECT
语句
objcmd.CommandText = "Select * from PAPER_DETAILS where ExamDate = Convert(date, getdate()) and StartTime = (Convert(time, getdate()) - 15)"
但是,它显示了这个错误
类型日期不是定义的系统类型
类型时间不是定义的系统类型
我使用的是SQLServer2005和使用VB.的ASP.NET
我参考了的上述查询
提前感谢!!
更新
StartTime | ExamDate
____________________|_____________________________
1/1/1900 4:20:00 PM | 7/27/2012 12:00:00 AM
我的表的示例数据,它将帮助您理解场景。
从上面的示例数据中,我希望用户只能在4:05:00 PM
到4:20:00 PM
的7/27/2012
上查看相应行的信息。我希望每个人都能理解我的想法。
objcmd.CommandText = "Select * from PAPER_DETAILS " +
"where ExamDate=dateadd(dd,0, datediff(dd,0, getDate()) " +
"and (getDate() >= DATEADD(n, -(DATEPART(minute, StartTime) " +
"+ DATEPART(HOUR, StartTime) * 60) - 15, GETDATE())) and " +
"(GETDATE() <= DATEADD(n, (DATEPART(minute, StartTime) + " +
"DATEPART(HOUR, StartTime) * 60), GETDATE()))"
我想你的ExamDate不包含时间信息,因此你需要一个没有时间信息的当前日期来获得准确的比较
此外,由于您的字段已经是DateTime类型,因此无需将结果转换为DateTime
编辑:添加了一个非常复杂的测试,提取StartTime小时和分钟,并使用它们来构建检查时间的限制。我无法测试它,所以请告诉我它是否有效。
使用此
Select * from PAPER_DETAILS
where ExamDate >= DATEADD(MINUTE, -15, getdate()) and ExamDate <= getdate()
使用DATEADD从当前时间减去15分钟
编辑:去掉"CONVERT(DATE..",因为你真的不需要它,然后再次测试
SELECT *
FROM PAPER_DETAILS
WHERE ExamDate = GETDATE()
AND StartTime = DATEADD(MINUTE,-15,GETDATE())
如果您想比较日期和时间差-2,请尝试以下操作。
objcmd.CommandText = "Select * from PAPER_DETAILS " +
"where CONVERT(varchar(20),ExamDate,101)=Convert(varchar(20),getdate(),101) " +
"and CONVERT(varchar(20),StartTime,108)=CONVERT(varchar(20), dateadd(MINUTE,-15,getdate()),108)"
这就是为什么,我终于得到了
objcmd.CommandText = "SELECT * FROM PAPER_DETAILS WHERE ((ExamDate = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))) AND ((DATEPART(minute, GETDATE()) >= DATEPART(minute, DATEADD(MINUTE, - 15, StartTime))) AND (DATEPART(hh, GETDATE()) = DATEPART(hh, StartTime)) AND (DATEPART(minute, GETDATE()) <= DATEPART(minute, StartTime)) ))"
并且,通过一些样本数据验证,它运行良好。!!!