Office中国论坛/Access中国论坛
标题: ACCESS中如何限定不含日期的时间范围? [打印本页]
作者: funhere 时间: 2007-4-19 17:56
标题: ACCESS中如何限定不含日期的时间范围?
我们单位货物出库在数据库都有记录。我现在想通过查询筛选出4月1号到4月3号,晚上22:00到第二天早上8:00之间出库的数据,我应该怎么做?
数据表中有个日期/时间字段记录出库的具体时间,如“2007-4-1 23:57:00”,我用TimeValue()函数提取出了具体出库时间,我想通过“>22:00 and <8:00”的语句限定时间范围,可是没有成功。请大侠指点。
作者: 一点通 时间: 2007-4-19 18:24
尝试用Format来格式时间
作者: tz-chf 时间: 2007-4-19 18:39
用between...and...试试
[此贴子已经被作者于2007-4-19 10:39:04编辑过]
作者: funhere 时间: 2007-4-19 18:51
between...and ...尝试过,不成功。
现在正在研究利用Format的方法。
作者: funhere 时间: 2007-4-20 18:53
http://access911.net/csdn/FileDescription.asp?mdb=2007-4-20&id=47
这是我的程序,大侠帮忙看看啊。
作者: hi-wzj 时间: 2007-4-20 19:08
筛选出4月1号到4月3号,晚上22:00到第二天早上8:00之间出库的数据,选出的区间是下表的区间吗?
2007/4/1 22:00--2007/4/2 8:00
2007/4/2 22:00--2007/4/3 8:00
2007/4/3 22:00--2007/4/4 8:00
作者: 一点通 时间: 2007-4-20 19:30
[attach]24055[/attach]
作者: funhere 时间: 2007-4-20 19:38
hi-wzj的理解是正确的,我又重新发了一个在不同情况下所要的不同结果的程序。
http://access911.net/csdn/filedescription.asp?mdb=2007-4-20&id=48
一点通的程序有一个问题,当我输入 开始时间:“22:00”,截止时间“8:00”的时候,给出的结果是早上8点到晚上22点之间的数据,而我实际想要的是晚上22点以后,到次日早上8点前的数据。
作者: 一点通 时间: 2007-4-20 19:47
在这个基础上再作一个判断就可获得你的要求,自己动手试下吧,我只是为你解决时间及日期的拆分问题
作者: funhere 时间: 2007-4-20 19:49
我尝试一下,我之前用IIF语句做过一个判断,不过在运行查询的时候系统说什么过于复杂,没有运行成功。
作者: 一点通 时间: 2007-4-20 20:10
受你的例子误导,其实不用拆分也不用判断也可获得准确的数据
[attach]24059[/attach]
作者: funhere 时间: 2007-4-20 20:45
一点通能不能帮忙做好传上来我看一下,我整了半天实在做不出,没达到我需要的效果。
作者: funhere 时间: 2007-4-20 20:46
哦,不好意思,我看看。看来不小心下了个套。
作者: funhere 时间: 2007-4-20 20:55
还是不行,如果跨天就把其它时间段的数据取出来了
比如我要取:
3月1号到3月5号这5天时间,每天晚上22:00点以后到第二天早上8:00以前(这个时间段内)的所有发车明细,结果系统把3月1号22点以后,到3月5号8点以前,之间所有发车的数据都取了出来。
现在的难点是怎么限定时间段。
作者: wwwwa 时间: 2007-4-20 22:04
1、必须加入对日期的判断;
2、分两个查询,一个查询当日22:00以后的记录,一个查询从第二日到结束日<=8:00的记录,再UNION。
作者: funhere 时间: 2007-4-20 22:13
这里的wwwwa,就是那里的wwwwb吧?
作者: 一点通 时间: 2007-4-20 22:16
如果是22:00到次日8:00,用一个查询也可查出,难点是假如改为1:00到晚上18:00就不行了(当天的),相信还是可以解决的!!
作者: funhere 时间: 2007-4-20 22:18
现在就是要解决跨天和不跨天时间段的选取问题。
作者: wwwwa 时间: 2007-4-20 22:28
2007-3-1到2007-3-5:
SELECT *
FROM T2
WHERE 发车时间 Between #3/1/2007# And #3/5/2007# And
hour(发车时间)>=22;
union
SELECT *
FROM T2
WHERE 发车时间 Between #3/2/2007# And #3/5/2007# And (hour(发车时间)<8 Or (hour(发车时间)=8 And minute(发车时间)=0));
作者: funhere 时间: 2007-4-20 22:36
那如果我这里的时间不是取当日22点以后到次日8点以前,而是改成取当日凌晨2点到当时早上8点以前的数据,那这个查询结果就不对了,会把所有时间的数据都取出来。
作者: wuaza 时间: 2007-4-20 22:37
应该将日期和时间拆开考虑。如果是跨天的。3月1日到3月5日22:00到次日8:00的话,就:
(time>22:00 and time<8:00 ) and (date>#3-1 22:00# and date<#3-6 8:00#)
如果是当天的。3月1日到3月5日1:00到次日18:00的话,就:
(time>1:00 and time<18:00 ) and (date>#3-1 1:00# and date<#3-5 18:00#)
作者: wwwwa 时间: 2007-4-20 22:44
以下是引用funhere在2007-4-20 14:36:00的发言:
那如果我这里的时间不是取当日22点以后到次日8点以前,而是改成取当日凌晨2点到当时早上8点以前的数据,那这个查询结果就不对了,会把所有时间的数据都取出来。
所以你要对时间的起始进行判断,24小时制,开始<结束即当天
SELECT * FROM TT WHERE RQ BETWEEN #2007-3-1# AND #2007-3-5# AND HOUR(RQ) BETWEEN 2 AND 8
开始>结束,即跨天,用我上述查询。
[此贴子已经被作者于2007-4-20 14:46:36编辑过]
作者: wwwwa 时间: 2007-4-20 22:49
以下是引用wuaza在2007-4-20 14:37:00的发言:
应该将日期和时间拆开考虑。如果是跨天的。3月1日到3月5日22:00到次日8:00的话,就:
(time>22:00 and time<8:00 ) and (date>#3-1 22:00# and date<#3-6 8:00#)
如果是当天的。3月1日到3月5日1:00到次日18:00的话,就:
(time>1:00 and time<18:00 ) and (date>#3-1 1:00# and date<#3-5 18:00#)
时间判断有问题哦,time>22:00 and time<8:00 ?
作者: wuaza 时间: 2007-4-20 22:54
那就改为>=或者<=。写的急忘了。
关键是这样的思路对不对。
作者: wwwwa 时间: 2007-4-20 22:59
关键是有没有满足time>22:00 and time<8:00的记录 ?
作者: wuaza 时间: 2007-4-20 23:01
见笑,确实存在严重的逻辑错误,呵呵。改成用or可不可以?
(time>=22:00 or time<=8:00 ) and (date>=#3-1 22:00# and date<=#3-6 8:00#)
[此贴子已经被作者于2007-4-20 15:05:45编辑过]
作者: funhere 时间: 2007-4-20 23:03
问题解决了,我本来只想用一个查询,现在看来不行,
我就用两个查询:
A查询选取选取大于开始时间“或者OR”小于截止时间的数据
B查询选取选取大于开始时间“并且AND”小于截止时间的数据
如果用户输入的开始时间大于截止时间,就调用“A查询”;
如果用户输入的开始时间小于截止时间,就调用“B查询”;
放在一个查询里在条件里用IIF语句判断数据选取范围是不成功的,系统提示公式过于复杂。
同时,也不是联合查询。
作者: wuaza 时间: 2007-4-20 23:09
以下是引用funhere在2007-4-20 15:03:00的发言:
问题解决了,我本来只想用一个查询,现在看来不行,
我就用两个查询:
A查询选取选取大于开始时间“或者OR”小于截止时间的数据
B查询选取选取大于开始时间“并且AND”小于截止时间的数据
如果用户输入的开始时间大于截止时间,就调用“A查询”;
如果用户输入的开始时间小于截止时间,就调用“B查询”;
放在一个查询里在条件里用IIF语句判断数据选取范围是不成功的,系统提示公式过于复杂。
同时,也不是联合查询。
终于找到了正解。恭喜!
作者: wwwwa 时间: 2007-4-20 23:11
以下是引用funhere在2007-4-20 15:03:00的发言:
问题解决了,我本来只想用一个查询,现在看来不行,
我就用两个查询:
A查询选取选取大于开始时间“或者OR”小于截止时间的数据
B查询选取选取大于开始时间“并且AND”小于截止时间的数据
如果用户输入的开始时间大于截止时间,就调用“A查询”;
如果用户输入的开始时间小于截止时间,就调用“B查询”;
放在一个查询里在条件里用IIF语句判断数据选取范围是不成功的,系统提示公式过于复杂。
同时,也不是联合查询。
解决了吗?如22:00-8:00,执行A,当天8:00之前的记录也在内哦。已经说过,必须加入对日期的判断。
作者: hi-wzj 时间: 2007-4-20 23:15
一个查询太复杂,那就分开。[attach]24060[/attach]
[此贴子已经被作者于2007-4-20 15:15:06编辑过]
作者: 一点通 时间: 2007-4-20 23:16
可能真的要用两个查询分别显示当天的或隔天的数据?
作者: funhere 时间: 2007-4-20 23:18
我把程序上传,大家看一下
作者: wwwwa 时间: 2007-4-20 23:20
以下是引用一点通在2007-4-20 15:16:00的发言:
可能真的要用两个查询分别显示当天的或隔天的数据?
一定是用两个查询,而且要加入日期判断,只用时间是不行的。
作者: funhere 时间: 2007-4-20 23:20
http://access911.net/csdn/FileDescription.asp?mdb=2007-4-20&id=49
已经上传到那里,这里我上传没成功。
作者: funhere 时间: 2007-4-20 23:22
呵呵,最后问wwwwa和wwwwb是什么关系啊?是不是一个人?
作者: wwwwa 时间: 2007-4-20 23:22
你只要测试我的查询结果是否
正确就行了,测试过了吗?
作者: wwwwa 时间: 2007-4-20 23:23
以下是引用funhere在2007-4-20 15:22:00的发言:
呵呵,最后问wwwwa和wwwwb是什么关系啊?是不是一个人?
是
作者: funhere 时间: 2007-4-20 23:23
查询结果是正确的。
作者: funhere 时间: 2007-4-20 23:24
我在CSDN里给了你15分,还有5分给的是“wangtiecheng(不知不为过,不学就是错!) ”,谢谢哥们啊
作者: wwwwa 时间: 2007-4-20 23:26
测试了一下你的程序,用你的条件,
3-1-3-5,22:00-8:00,明显3-1日
8:00以前的记录不应该在内。
作者: wwwwa 时间: 2007-4-20 23:27
以下是引用funhere在2007-4-20 15:23:00的发言:
查询结果是正确的。
你的查询还是我的?
作者: wuaza 时间: 2007-4-20 23:36
好久没有这么热门的帖子了。
作者: hi-wzj 时间: 2007-4-20 23:45
另一种方式就是建立窗体,用代码来设定where的参数值应该也可以。
作者: 一点通 时间: 2007-4-21 00:28
测试过结果是不对的
作者: 一点通 时间: 2007-4-21 00:45
利用两个查询早就实现过,问题看有没有人能二合为一,请测试
[attach]24062[/attach]
作者: funhere 时间: 2007-4-21 00:49
没错啊,你是以什么条件测试,发生了怎样的错误?
作者: funhere 时间: 2007-4-21 00:51
是啊,有没有人能实现一个查询完成这个功能。
作者: 一点通 时间: 2007-4-21 01:06
以下是引用funhere在2007-4-20 16:51:00的发言:
是啊,有没有人能实现一个查询完成这个功能。
象43楼说的一样,只能由VBA来实现了
作者: andymark 时间: 2007-4-21 01:35
VBA实现简单些
作者: funhere 时间: 2007-4-21 02:11
OK
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |