Office中国论坛/Access中国论坛

标题: [已解决]请教:如何用查询得出两个给定日期之间的所有日期列表? [打印本页]

作者: aslxt    时间: 2013-5-30 09:06
标题: [已解决]请教:如何用查询得出两个给定日期之间的所有日期列表?
如题,希望用查询的方式得出结果,不用表。
比如:
给定日期  2013-4-23、2013-5-26
通过查询得出:
2013-4-23
2013-4-24
2013-4-25
...
2013-5-26

解决办法总结:
http://www.access-cn.com/info/3696-cn.html

作者: todaynew    时间: 2013-5-30 12:40
function datelist(byval d1 as date,byval d2 as date) as string
  '功能:为组合框或列表框提供数据源(值列表)
  dim str as string
  dim d as date
  d=d1
  do while true
     if d>d2 the exit do
     str=str & d & ";"
     d=dateadd("d",1,d)
  loop
  datelist=left(str,len(str)-1)
end function
作者: aslxt    时间: 2013-5-30 13:10
todaynew 发表于 2013-5-30 12:40
function datelist(byval d1 as date,byval d2 as date) as string
  '功能:为组合框或列表框提供数据源 ...

谢谢版主的回复。
我的用途不是解决组合框或列表框的数据源,而是解决“查询指定时间段内所有日期的营业收入,如果某天没有营业,也就没有收入的记录,但是又需要体现那天的收入为零”这样的需求。
是不是只有用临时表来列出所有的日期,然后才能用查询得出结果?
作者: todaynew    时间: 2013-5-30 14:36
aslxt 发表于 2013-5-30 13:10
谢谢版主的回复。
我的用途不是解决组合框或列表框的数据源,而是解决“查询指定时间段内所有日期的营业 ...

将缺少的日期追加到收入表中即可。

作者: cgsilicone    时间: 2013-5-30 18:29
用查询可以实现,两个查询即可。
第一步,任意选择一个表(数据足够多,能够唯一排序,有自动编号最好),然后就生成所需记录条数(结束时间-开始时间)的查询1。
第二步,利用以上查询1,很容易得出如下结果的查询2:
2013-4-23
2013-4-24
2013-4-25
...
2013-5-26
第三步,利用查询2就可以做很多事了,
作者: aslxt    时间: 2013-5-31 09:06
本帖最后由 aslxt 于 2013-5-31 09:12 编辑
cgsilicone 发表于 2013-5-30 18:29
用查询可以实现,两个查询即可。
第一步,任意选择一个表(数据足够多,能够唯一排序,有自动编号最好), ...


数据足够多,是指多到保证明天都有记录吗?
如果是那样就好办了,数据没有多到那种程度!
如附件,“营业报表”是数据源,“查询结果”是需要的查询结果示意。
[attach]51859[/attach]

作者: cgsilicone    时间: 2013-5-31 15:37
aslxt 发表于 2013-5-31 09:06
数据足够多,是指多到保证明天都有记录吗?
如果是那样就好办了,数据没有多到那种程度!
如附件,“ ...

我不能处理你的附件,请检查附件。
数据足够多的意思是,如果你要得到2013-1-1至2013-12-31的连续日期,数据库中表的数据需要达到356条无重复数据。对这个要使用的表是没有太多限制的,只需要记录条数够(不重复),不管字段有多少,是什么字段。

作者: aslxt    时间: 2013-5-31 17:56
cgsilicone 发表于 2013-5-31 15:37
我不能处理你的附件,请检查附件。
数据足够多的意思是,如果你要得到2013-1-1至2013-12-31的连续日期, ...


达不到你说的数据量,就像自动编号被删了一样,不连续
[attach]51871[/attach]

作者: cgsilicone    时间: 2013-6-1 10:45
本帖最后由 cgsilicone 于 2013-6-1 11:49 编辑
aslxt 发表于 2013-5-31 17:56
达不到你说的数据量,就像自动编号被删了一样,不连续

我没有讲清思路,请看看附件,很容易实现,效率也高。
表中数据的多少,决定了查询“第2步查询2”中“union” 的多少。数据够多,就不用“union“。
作者: netguestcn    时间: 2013-6-1 22:26
本帖最后由 netguestcn 于 2013-6-2 08:12 编辑

供参考:
1、建一临时表:日期表
2、利用自定义函数将营业起止日期间的所有日期追加到“日期表”
3、生成查询:无营业额日期
4、利用联合查询得到最终结果
[attach]51887[/attach]
作者: cgsilicone    时间: 2013-6-2 08:38
netguestcn 发表于 2013-6-1 22:26
供参考:
1、建一临时表:日期表
2、利用自定义函数将营业起止日期间的所有日期追加到“日期表”

楼主已经明确要求“不用表“。你的方法不可行。
可以参看我的方法,其中“第1步查询1”,“第2步查询2“可以合并为一个查询,也就是说一个
查询就可以得到“连续日期列表“,分开写只是为了说明思路。
作者: aslxt    时间: 2013-6-2 09:46
cgsilicone 发表于 2013-6-1 10:45
我没有讲清思路,请看看附件,很容易实现,效率也高。
表中数据的多少,决定了查询“第2步查询2”中“un ...

高!学习中。
作者: aslxt    时间: 2013-6-2 11:03
本帖最后由 aslxt 于 2013-6-2 11:10 编辑

十分感谢cgsilicone ,利用cgsilicone 的方法做成了,共享一下附件:
[attach]51889[/attach]
[attach]51890[/attach]

没有使用临时表,只是根据数据源的情况动态修改查询的SQL语法,基本满足需求。
如果哪位能够做成自定义函数或类模块,在查询中直接引用(不需要窗体的代码),那就完美了。

作者: layaman_999    时间: 2013-6-2 17:57
还是单独建立一个日期表吧,里面存储合适的连续日期段(2012-01-01到2015-01-01,数据太多也会影响速度),用这个表去LEFT JION你要查询的表,这样直观方便管理且速度较为理想)
作者: layaman_999    时间: 2013-6-2 18:02
cgsilicone 发表于 2013-6-1 10:45
我没有讲清思路,请看看附件,很容易实现,效率也高。
表中数据的多少,决定了查询“第2步查询2”中“un ...

方法可行,效率不高
作者: cgsilicone    时间: 2013-6-2 20:08
layaman_999 发表于 2013-6-2 18:02
方法可行,效率不高

限定条件下的解决方案,效率只是相对的。
如果有限定条件下的高效率好方法,希望能分享。
作者: 竹笛    时间: 2013-6-3 15:50
这个最好还是要用临时表来做
作者: 2008-cjl    时间: 2013-6-25 10:48
那位老师帮我把附件中日期范围内年月和天数在查询内用竖表表现出来,万分感谢
在日期范围内对每个月进行天数统计
例如,如果开始日期为2004-10-01,结束日期为2005-01-06,那么我应该如何在上述日期范围内对每个月进行分组,来得到如下的输出:
年月    天数
2004/10 31
2004/11 30
2004/12 31
2005/01 6
感谢您给予我的任何帮助

通过Sgrws表内开始时间和结束时间二个字段来做一个查询实现上面的功能,把计划分解到每个月





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3