Access交流中心

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

求教一下,关于Cdate() 使用中对空值的处理

baiqingrui  发表于:2014-07-28 14:33:13  
复制

我有一张表,如下图所示。其中生产日期是日期型,但过期日期是字符型字段。我想先用cdate把过期日期转为日期型,然后将过期日期<生产日期的筛选出来。但由于过期日期存在空值,我不知道怎么处理。我开始新建一个字段 【过期日期2】=iif(isnull(过期日期),"",cdate(过期日期2)),但是再筛选时会出错(过期日期<生产日期),应该是空值处理的不对。请教下如何处理,多谢!


产品

产品ID 生产日期 过期日期
1 2006/12/4
2 2007/3/29
3 2008/9/4 2007/1/1
4 2009/12/22
5 2009/12/23
6 2011/6/10 2010/2/9
7 2012/1/26
8 2012/3/28
9 2012/5/3 2013/1/4
10 2012/11/6

 

Top
cspa 发表于:2014-07-28 17:01:19
把过期日期也改为日期型不就结了。使用时应先判断过期日期是否为空,如为空就不要比较(过期日期<生产日期)。只有不为空的比较才有意义。

baiqingrui 发表于:2014-07-28 20:54:12
如果过期日期本来就是日期型的话我还有必要发这个帖子了吗?

金宇 发表于:2014-07-28 22:20:49
将【过期日期2】=iif(isnull(过期日期),"",cdate(过期日期2)) 这句中的""改为null试试呢



cspa 发表于:2014-07-29 08:15:54
baiqingrui,好吧,如果你坚持要这样做,给你一个做好的,应该是你要的结果点击下载此附件

朱先生 发表于:2014-07-30 09:10:59
SELECT 表1.产品ID, 表1.生产日期, 表1.过期日期
FROM 表1
WHERE (((表1.过期日期)<>""));



朱先生 发表于:2014-07-30 09:12:45
表中举例数据不符现实,不会先过期后生产吧

baiqingrui 发表于:2014-07-30 20:22:02
谢谢楼上两位, 我很想知道有没有办法把过期日期  这个字段完全转换成日期型, 空值也变成是日期型字段中的空值. 我不知道我的理解对不对,  如果用【过期日期2】=iif(isnull(过期日期),"",cdate(过期日期2)), 那么原来是空字符的还是空字符, 不是空字符的才转换为日期型, 造成同一个字段里有两种类型数据,所以才导致后面再把过期日期当日期型字段使用时就出错了.

cspa 发表于:2014-07-30 23:23:01

1、没有所谓日期型空值的概念,空值就是空值。与字段类型无关。将过期日期转换成日期型是空值的也还会出你说的错误。实际上如用VBA编程的办法是先做判断,如是空值则不做比较运算,如有值才比较(过期日期<生产日期),(这里暂不讨论你给出的数据的合理性);

2、如你坚持用查询而不用编程,那我上次给你的例子即是符合你的要求的,不会出错。不知你是否认真看了。再贴一遍例子如下:

http://www.accessoft.com/forum_attached/2014/file/201407/201407290815474427.rar

3、总之,思路应是先排除过期日期为空的记录,再进行比较就不会出错了。 



baiqingrui 发表于:2014-07-31 14:36:40

cspa,你好,我对vba不是很懂,但我反复测试了一下,证明你讲的好像不完全对,测试内容如下:


测试数据如下表,其中过期日期为字符型,出厂日期为日期型,数值完全一样

产品ID 生产日期 过期日期 出厂日期
1 2006/12/4

2 2007/3/29

3 2008/9/4 2007/1/1 2007/1/1
4 2009/12/22

5 2009/12/23

6 2011/6/10 2010/2/9 2010/2/9
7 2012/1/26

8 2012/3/28

9 2012/5/3 2013/1/4 2013/1/4
10 2012/11/6

查询1:SELECT 产品.产品ID, 产品.生产日期, 产品.出厂日期 FROM 产品 WHERE (((产品.[出厂日期])<[生产日期])); 正常运行

查询2:SELECT 产品.产品ID, 产品.生产日期, IIf(IsNull([产品].[过期日期]),"",CDate([产品].[过期日期])) AS 过期日期_cdate FROM 产品 

                                       WHERE (((IIf(IsNull([产品].[过期日期]),"",CDate([产品].[过期日期])))<[生产日期]));

                                                运行出错,提示:“标准表达式中数据类型不匹配

以上测试结果似乎证明:过期日期_cdate  中的空值与[生产日期]中的空值是不一样的,我不知道如何解释,请高人指点!




baiqingrui 发表于:2014-08-03 16:33:36
求高手指点一下迷津!

总记录:10篇  页次:1/1 9 1 :