在做小工具玩的时候,我需要使用程序在Access中插入日期时间类型数据,比如说steem上文章的创建日期。从steem读回的时间格式一般是这样的'created': '2018-05-20T02:42:00'
,这是我昨天一篇文章的发布日期。
(图源 :pixabay)
T
的含义
以往我们都见惯了2018-05-20 02:42:00
这样的日期时间串,那么这个中间的大写T
有什么特别含义呢?在Microsoft网站找到双眼冒花也没找到和这个有关的内容,可能是我没找对地方,最后终于在W3C的网站中找到这样一篇文章Date and Time Formats,其中说到
Note that the "T" appears literally in the string, to indicate the beginning of the time element, as specified in ISO 8601.
原来就是把日期和时间放一起表示的时候用于分隔日期和时间的,吐血,害我找了半天。
插入时间日期
既然知道 T
就是个分隔符,那么我来向Access表中插入日期啦。首先在表中加入created
字段,类型设置为Date/Time
。然后使用SQL尝试插入数据:
insert into test(created) values('2018-05-20T02:42:00');
不出意料的失败了。看手册中有一个CData函数,说是可以把字符串转换成时间日期类型,拿来试试
insert into test(created) values(CDate('2018-05-20T02:42:00'));
还是不行,我晕,它咋就不匹配呢?
Data type mismatch in criteria expression
既然都不行,我试试不要这个T
呢?结果
insert into test(created) values('2018-05-20 02:42:00');
insert into test(created) values(CDate('2018-05-20 02:42:00'));
两条语句都可以正确插入时间日期,这期间和我还DateValue以及Format等函数各种较劲,无一例外地没能成功,其中的辛酸不足为外人道也。😭
解决
既然知道了问题所在,解决起来就好办多了,在程序中,我先把得到的时间日期中的T替换成空格,然后在传入SQL语句,之后无论是直接插入还是使用CDate转换后插入,都没什么问题。
不过我还是倾向于使用带CDate的插入语句,这样可以和数据库中字段类型对应。估摸直接插入时间字符串是Access自动处理的转换而已,具体情况就不深究了。
另外,虽然费了了些周折,走了些弯路,但是总算搞懂了T
的含义,算是一点点收获吧。尽管这个T
除了给我制造了一些麻烦没起啥作用。