我在 MySQL 中有一个表。
create table demo ( theDate datetime );
我插入了两个日期,一个在夏令时,一个不是。
(require '[clj-time.core :as t])
(require '[clj-time.coerce :as coerce])
(require '[korma.core :as k])
(k/insert :demo (values {:theDate (coerce/to-sql-date (t/date-time 2014 01 01))}))
(k/insert :demo (values {:theDate (coerce/to-sql-date (t/date-time 2014 06 01))}))
从我的 MySQL 客户端看来,正确的值已经进入:
mysql> select * from demo;
+---------------------+
| theDate |
+---------------------+
| 2014-01-01 00:00:00 |
| 2014-06-01 00:00:00 |
+---------------------+
当我使用 Korma 进行选择时(我不认为 Korma 在 JDBC 之上做任何相关的事情),我在非夏令时日期中得到一个时区差异。
=> (k/select :demo)
[{:theDate #inst "2014-01-01T00:00:00.000000000-00:00"}
{:theDate #inst "2014-05-31T23:00:00.000000000-00:00"}]
当我选择日期时:
(map #(-> % :theDate coerce/from-sql-date t/month) (k/select :demo))
(1 5)
而我本来希望得到(1 6)
(我故意把日期放在一个月的边界上来说明)。当我使用date
而不是datetime
MySQL 类型时,也会发生同样的事情。
我错过了什么?如何插入[(t/date-time 2014 01 01) (t/date-time 2014 06 01)]
和返回(1 6)
?