+ -
当前位置:首页 → 问答吧 → sql语句的问题,求高手帮忙!!

sql语句的问题,求高手帮忙!!

时间:2011-12-23

来源:互联网

SELECT * FROM Result
WHERE 测量时间 between #03/01/2011 6:30:30# and #03/27/2011 23:45:30#;

我用上面的sql语句检索出的却是是3月1号到3月27号所有日期24小时的数据,我想检索出日期在3月1号到3月27号,同时时间又在6:30:30 and 23:45:30之间的数据应该怎么弄?求高手指导。

作者: fg321   发布时间: 2011-12-23

SELECT * FROM Result
WHERE (测量时间 between #03/01/2011 6:30:30# and #03/27/2011 23:45:30#)
and (convert(varchar,测量时间,8) between #6:30:30# and #23:45:30#)

不知道你那可以用这函数不,试试

作者: zx342752854   发布时间: 2011-12-23

带了#你用的是ACCESS数据库吧,LS方法可以,把时间转换成 Short Time再判断一次

作者: wangsunjun   发布时间: 2011-12-23

我使用的时候提示说是convert这个函数未定义,怎么办啊?

作者: fg321   发布时间: 2011-12-23

在SQL中,datetime类型的字段,其时间段检索时,可以采用两种方式来过滤:
1. Between ... And
2. >= 和 <

但是,两者检索的结果相同吗?

比如,检索2010五月份的所有记录,按照上面两种方式,其SQL写法如下:

(DT字段 Between '2010-5-1' And '2010-6-1') 和(DT字段>='2010-5-1' and DT字段<'2010-6-1')

检索结果相信会令人很意外,竟然差别很大。

//-- 创建临时表并初始化数据
CREATE TABLE #dts(c1 char(1), dt datetime)
INSERT INTO #dts (c1, dt) VALUES('a', '20040305 09:12:59') 
INSERT INTO #dts (c1, dt) VALUES('b', '20040305 16:03:12') 
INSERT INTO #dts (c1, dt) VALUES('c', '20040306 00:00:00') 
INSERT INTO #dts (c1, dt) VALUES('d', '20040306 02:41:32') 
INSERT INTO #dts (c1, dt) VALUES('e', '20040315 11:45:17') 
INSERT INTO #dts (c1, dt) VALUES('f', '20040412 09:12:59') 
INSERT INTO #dts (c1, dt) VALUES('g', '20040523 11:43:25')

//-- 检索20040305一整天的数据
SELECT c1, dt FROM #dts WHERE dt BETWEEN '20040305' AND '20040306' 
结果:
20040305 09:12:59
20040305 16:03:12
20040306 00:00:00
(怪了,怎么连20040306 00:00:00这条记录也有?)
[原因]:因为Between是包容第二个日期范围的00:00:00记录!

//-- 既然如此,那么第二个日期检索条件改为'20040305 23:59:59.999' 
SELECT c1, dt FROM #dts WHERE dt BETWEEN '20040305' AND '20040305 23:59:59.999' 
结果:
20040305 09:12:59
20040305 16:03:12
20040306 00:00:00
(真TMD怪,还是有20040306 00:00:00这条记录!!!)
[原因]:因为在datetime日期类型的定义中,"2004-03-05 23:59:59.999" 会被自动舍入"2004-03-06 00:00:00.000"
-----------------------------
此时,可发现Between..And操作基于日期格式的检索,确实够麻烦的!

解决办法:

那就是采用">="和"<"的方式来检索,这样可以避免以上麻烦的操作!
//-- 检索20040305一整天的数据
SELECT c1, dt FROM #dts WHERE dt >= '20040305' AND dt < '20040306' 

//-- 检索200403整月的数据
SELECT c1, dt FROM #dts WHERE dt >= '20040301' AND dt < '20040401' 
或者
SELECT c1, dt FROM #dts WHERE DATEPART(year, dt) = 2004 AND DATENAME(month, dt) = 'March'

采用这种方式,可以良好的避免数据检索错误!

作者: ZeroKiseki   发布时间: 2011-12-23

那就是access中没有Convert函数咯

作者: wangsunjun   发布时间: 2011-12-23