Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

日期范围内的生日查询

jialiang  发表于:2011-07-18 17:23:13  
复制

我做了个主子窗体结构来查询日期范围内的生日客户资料,查询是这样写的,但是不知道为什么,每逢1号到另一个月1号就什么都查不出来了(比如71号到81号),不知道出了什么问题,万望指教,谢谢!

 

SELECT *FROM 客户资料

WHERE (((Month([客户资料].[客户生日])) Between Month([Forms]![客户资料 生日筛选 主窗体]![Text0]) And Month([Forms]![客户资料 生日筛选 主窗体]![Text2])) AND 

((Day([客户资料].[客户生日])) Between Day([Forms]![客户资料 生日筛选 主窗体]![Text0]) And 

Day([Forms]![客户资料 生日筛选 主窗体]![Text2])))

ORDER BY Month([客户资料].[客户生日]), Day([客户资料].[客户生日]);

 

 

Top
zhcosin 发表于:2011-07-18 17:29:20

你想啊,你用AND连接了两个条件,那个Day Between Day显然就是查不到了嘛,既要在7月和8月之间,又要在1号到1号之间,哪找去?

解决问题方法:别取月份和日号了,直接用日期比较,有专门的日期函数。



jialiang 发表于:2011-07-18 17:33:00

那请问应该那个函数呢?



zhcosin 发表于:2011-07-18 17:45:07
假设你要查询的起止日期是DateStart和DateEnd(日期类型),你就用:客户生日 Between DateStart And DateEnd

zhcosin 发表于:2011-07-18 17:50:03

客户生日 Between [Forms]![客户资料 生日筛选 主窗体]![Text0] And [Forms]![客户资料 生日筛选 主窗体]![Text2]



jialiang 发表于:2011-07-18 18:01:14
也是不行,好奇怪~

SELECT *FROM 客户资料

WHERE (((客户资料.客户生日) Between [Forms]![客户资料 生日筛选 主窗体]![Text0] And [Forms]![客户资料 生日筛选 主窗体]![Text2]));

跟设置日期格式有关系的吗?那个日期范围文本框,我是通过日期控件输入的,也有关系的吗?



jialiang 发表于:2011-07-18 18:07:01

我想过了,这样不行,这个是本年的啊,我要查日期范围内生日,当然不一定是本年啊。呵呵



zhcosin 发表于:2011-07-18 20:03:35
哦,你传上附件我帮你看看。

jialiang 发表于:2011-07-18 22:45:10
jialiang 发表于:2011-07-18 22:46:59
想了半个晚上都想不通,又不懂代码,呵呵,懒办法又试过不行,不知道能不能解决。谢谢!

dalianliuliu 发表于:2011-07-19 13:38:41

是想要这样吗?

点击下载此附件

jialiang 发表于:2011-07-19 16:10:26

不是这样的,就是能查7月1日到8月1日就行了。谢谢!



dalianliuliu 发表于:2011-07-19 16:32:38

相只查同一年的,间隔时间是1个月的数据吗?



zhcosin 发表于:2011-07-19 18:41:30

点击下载此附件

我做了一个例子实现了,采用的方法如下:

用两个日期类型的变量DateStart和DateEnd分别保存用户输入的起始日期和终止日期(注意到这里输入的年份是没有实际用处的,只是为了方便使用日期类型的函数),在客户表中利用循环对记录进行逐条比较(比较方法稍后介绍),将符合条件的客户的客户ID存入一个新表(名为“客户_temp”)中,比较方法是先将变量DateStart和DateEnd的年份都修改成当前记录的客户生日字段的年份值,利用DateDiff函数比较客户生日和修改了年份的DateStart以及DateEnd,如果客户生日位于这两个日期之间,就将此客户的客户ID存入新表“客户_temp”,循环完成后,符合条件的客户的客户ID就都存入了这个新表,然后将窗体上子窗体的记录源设置为:客户表中满足条件(客户ID存在于新表中)的记录集。

由于要逐条处理记录,所以使用了ADO的Connection和Recordset对象。详细见附件。



西出阳关无故人 发表于:2011-07-19 23:30:57

 

点击下载此附件

如附件(窗体3、查询4),没有那么复杂。

主要的问题是日期的比较必须直接使用标准日期,不能单独比较月份和日期



西出阳关无故人 发表于:2011-07-19 23:38:47

分别比较月份和日期的情况是行不通的,比如你要找7月15日到8月5日的生日纪念日的客户,如果A客户的纪念日为8月2日。开始比较月份: 7<=月份<=8,客户的月份是符合查询条件的;比较日期,你实际要比较的是:7月15日<=客户生日日期<=8月5日,怎么单独拿日期来比较?15<=客户生日日期<=5,显然不符合逻辑。

上面的例子是在13楼的基础上做的



西出阳关无故人 发表于:2011-07-19 23:50:03
SELECT 客户.客户ID, 客户.客户名称, 客户.客户生日, DatePart("YYYY",forms!窗体3!开始)-DatePart("YYYY",[客户生日]) AS 周岁
FROM 客户
WHERE (((DateAdd("YYYY",DatePart("YYYY",[forms]![窗体3]![开始])-DatePart("YYYY",[客户生日]),[客户生日]))>=[forms]![窗体3]![开始] And (DateAdd("YYYY",DatePart("YYYY",[forms]![窗体3]![开始])-DatePart("YYYY",[客户生日]),[客户生日]))<=[forms]![窗体3]![结束]))

西出阳关无故人 发表于:2011-07-20 00:01:15

查询条件主要意思:

DatePart("YYYY",forms!窗体3!开始)-DatePart("YYYY",[客户生日]) ----'''得到客户今年生日纪念日后的周岁

DateAdd("YYYY",DatePart("YYYY",[forms]![窗体3]![开始])-DatePart("YYYY",[客户生日]),[客户生日]))----'''得到客户今年的周岁纪念日

再用“客户今年的周岁纪念日”去和你指定的“开始”和“结束”的日期比较,如果在“开始”和“结束”之间,就选择他的记录

当然比较也可以用Between来做。



西出阳关无故人 发表于:2011-07-20 00:13:09

在你的例子中,查询修改为:

SELECT 客户资料.客户ID, 客户资料.客户姓名, 客户资料.客户生日, 客户资料.客户手机, 客户资料.客户电话, 客户资料.客户类别ID, 客户资料.客户来源ID, 客户资料.所属行业ID, 客户资料.客户电邮, 客户资料.通讯地址
FROM 客户资料
WHERE (((DateAdd("YYYY",DatePart("YYYY",[Forms]![客户资料 生日筛选 主窗体]![Text0])-DatePart("YYYY",[客户生日]),[客户生日])) Between [Forms]![客户资料 生日筛选 主窗体]![Text0] And ([Forms]![客户资料 生日筛选 主窗体]![Text2])))
ORDER BY Month(客户资料.客户生日), Day(客户资料.客户生日);



zhcosin 发表于:2011-07-20 07:55:43
"西出阳关无故人"的解答很精彩,和我解答的算法是一样的,都是利用两个年份等于客户生日年份,而月份和日号等于窗体上起始日期和终止日期的月份日号,与客户端生日进行比较,你充分利用了DateAdd函数,我用的是DateSerial函数,你用两个日期作差,我用了DateDiff函数,差别最大的地方就是怎样在客户表中逐条比较,你采用SQL语句在WHERE条件中加入比较条件,我没想到这点,用到是复杂的ADO的记录集对象逐条比对客户记录。楼主的问题当是基本解决了。

西出阳关无故人 发表于:2011-07-20 12:12:00
没有考虑跨年的情况,不知道结果是否正确,比如要查找2011-12-26~2012-1-10之间的客户的生日,结果是否正确?待验证。

总记录:23篇  页次:1/2 9 1 2 8 :