2010-07-02 31 views
2

我正在使用Access 2003.在这样的文本数据列中有一个包含某些日期值的表;访问数据转换问题

May-97 
Jun-99 
Jun-00 
Sep-02 
Jan-04 

我需要将其转换为正确的日期格式,到另一个日期/时间列,因此,创建一个新的日期/时间列和刚刚更新从文本列中的值到这个新列。起初它看起来很好,除了2000年以后的几年。新的列将日期转换为如下;

May-97 > 01/05/1997 
Jun-99 > 01/06/1999 
Jun-00 > 01/06/2000 
Sep-02 > 01/09/2010 
Jan-04 > 01/01/2010 

正如你可以看到任何一年的数据在2000年以后得到转换至2010年,如果我查询中使用的格式(dateString“DD/MM/YYYY”)的数据同样的事情发生。

任何想法,为什么这是这样吗?我是否必须分月份和年份再次合并它们?

感谢

回答

2

Access/Jet/ACE(以及许多其他Windows组件)使用一个窗口来解释2位数年份。对于00至29,假设为2000至2029年,以及30至99年,1930至1999年。这是为了在1997 - 98年的时间框架内解决Y2K兼容性问题。

我不允许在任何应用程序的任何位置输入2位数的年份。因此,我不必有任何代码来解释用户的意图(可能会犯错误)。

这也指出了使用Jet/ACE日期值显示格式和数据存储的独立性问题。存储为双精度型,整数部分表示自12/30/1899以来的一天,小数部分表示一天内的时间部分。您输入的任何日期将被存储为只有一个数字。

如果您输入的日期不完整(即没有明确指出年份的世纪),您的应用程序必须对用户的意图做出假设。 2029窗口是解决2位数年份问题的一种解决方案,但在我看来,依靠它是完全不合适的,因为用户可以在控制面板区域设置中更改它。我不写任何复杂的代码来验证日期,我只需要输入4位数的年份并完全避免该问题。自从c以来我一直这样做。 1998年是理所当然的,每个人都完全习惯于它。当时一些用户大声疾呼,而且我把“这是因为Y2K”作为关闭他们的借口。一旦他们使用它,它就成了一个没有问题的问题。

0

访问似乎MM-YYYY格式MM-DD格式之间得到conduced。不知道为什么它会在2000年之后的日期做它,但通过将原始字符串日期转换为完整日期(01年5月1日)来解决它。现在,Access将年份转换为2001年而不是2010年。

1

日期不明确,所以它将02看作日期编号。根据您所在地区,这样的事情可能适合:

cdate("01-" & Field) 

但是,它可能是最好的转换为四位数的年,月,日的格式,这始终是明确的。

+0

我明白你的意思,但是否需要将最后2位数字作为年份或日期,期望Access始终以单向方式进行操作。但它选择一些记录作为年份和其他作为日期。因此混乱。 – Sivakanesh 2010-07-03 21:43:59

+0

Remou,只是要挑剔我建议你在你的帖子前添加“四位数字”。 – 2010-07-04 03:58:34

+0

@Tony Toews,完成。 @Sivakanesh从某种意义上说,这个规则是一致的,如果该数字小于或等于该月份的天数,则将被解释为一天,否则为一年。也许有一点“2000年”问题也出现了。 – Fionnuala 2010-07-04 08:45:02

0

如果您不提供一年,并且输入日期字段的两组数字可能是一个日期和月份,那么Access将假定当前年份。所以你的前三个日期肯定有一年。但最后两个没有。

请注意,这不是Access,而是实际操作系统。你在Excel中得到相同的结果。在这个问题上,我与一些微软员工进行了一次有趣的对话,实际上是OLEAUT32.DLL。