每天进步一点点:使用SQL语句在Access中插入日期时间类型数据

在做小工具玩的时候,我需要使用程序在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除了给我制造了一些麻烦没起啥作用。

参考链接

H2
H3
H4
3 columns
2 columns
1 column
6 Comments