我正在使用Access 2003.在文本数据列中有一个包含一些日期值的表,如下所示;
May-97
Jun-99
Jun-00
Sep-02
Jan-04
我需要将它们转换为正确的日期格式并转换为另一个日期/时间列,因此创建一个新的日期/时间列,只需将Text列中的值更新为此新列。起初它看起来很好,除了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年。如果我使用FORMAT(dateString,“dd / mm / yyyy”)查询数据,也会发生同样的事情。
为什么会这样?我是否必须拆分月份和年份并再次合并?
由于
答案 0 :(得分:2)
Access / Jet / ACE(以及许多其他Windows组件)使用窗口来解释2位数年份。对于00到29,它假定为2000-2029,并且30-99,1930-1999。这是为了在1997 - 98年的时间框架内解决Y2K兼容性问题。
我不允许在任何应用中的任何地方输入2位数年份。因此,我没有任何代码来解释用户的意图(可能会出错)。
这也指出了显示格式和数据存储与Jet / ACE日期值的独立性问题。存储为双精度,整数部分表示自18/30/1899起的日期,小数部分表示当天的时间部分。您输入的任何日期将仅存储为一个数字。
如果您输入的日期不完整(即没有明确指示年份的世纪),您的应用程序必须假设用户的意图。 2029窗口是2位数年份问题的一种解决方案,但在我看来,依赖它是完全不合适的,因为用户可以在其控制面板区域设置中更改它。我没有编写任何复杂的代码来验证日期,我只需要4位数的年份输入并完全避免问题。我一直这样做,因为c。 1998年是理所当然的,每个人都完全习惯了。当时有几个用户发出嘎嘎声,我把“这是因为Y2K”作为关闭他们的借口。一旦他们使用它,它就成了一个问题。
答案 1 :(得分:1)
日期不明确,因此它将02视为日期编号。根据您的语言环境,这样的事情可能适合:
cdate("01-" & Field)
但是,最好转换为四位数的年,月,日格式,这始终是明确的。
答案 2 :(得分:0)
访问似乎是在MM-YYYY格式和MM-DD格式之间进行的。不知道为什么它会在2000年之后的日期进行,但是通过将原始字符串日期转换为完整日期(01-May-01)来解决它。现在Access将年份转换为2001年而不是2010年。
答案 3 :(得分:0)
如果您没有提供一年,并且在日期字段中输入的两组数字可以是日期和月份,则Access将采用当前年份。所以你的前三个日期肯定有一年。但最后两个没有。
请注意,这不是Access,而是实际操作系统。您在Excel中获得相同的结果。我在这个问题上与一些微软员工进行了有趣的交流,实际上是OLEAUT32.DLL。