如何比较java中的Date与mysql中datetime类型的字段?

现在mysql数据库db有一张表test(id bigint,createTime datetime),部分表数据如下:

id createTime
1 2017-01-02 10:34:33
2 2017-01-05 11:35:31
3 2017-01-07 13:20:01
4 2017-01-13 10:06:33
5 2017-01-15 11:22:53
6 2017-01-20 10:34:33
7 2017-01-25 10:46:25

现在要通过java代码拼接sql字符串的形式查出所有创建时间在2017-01-15 00:00:00之后的数据。

限定 : 通过以下两种方式查询

  • 第一种 :拼接字符串

String sql = "select id,createTime from db.test where createTime > " + javaCreateTime
  • 第二种 : 预编译的形式传入查询参数:

String sql = "select id,createTime from db.test where createTime > ?"

请问 : 第一种方式的javaCreateTime应该怎么传?第二种预编译的方式参数又应该怎么传?


从网上找到解决的办法了:

  • 第一种传入:

String sql = "select id,createTime from db.test where createTime > '2017-01-15 00:00:00' "
  • 第二种

String sql = "select id,createTime from db.test where createTime >  ? ";
PreparedStatement preStat = connection.prepareStatement(sql);

preStat.setString(1, '2017-01-15 00:00:00');
ResultSet rs = preStat.executeQuery();

以上两种方式都是直接传入字符串,而且都是yyyy-MM-dd HH:mm:ss。请问为什么可以达到目的?
mysql会自动将字符串转化为datetime?。
其底层运行机制到底是什么原因呢?


阅读 10.2k
2 个回答

mysql会自动将字符串转化为datetime?

這要看你將它們加入表的時候,它們本身的datatype是不是datetime

又或者是它們在mysql的column可能已經set成datetime

你可以打 desc test;查看

另外 2017-01-15 00:00:00 本身的格式已經是 datetime.

比较好的实践经验是:

从不使用 DateTime/Date 存储时间/日期
只使用Unix时间戳来存储( int )

展示( 人类友好/可读 ), 交给应用层的程序去转化( timestamp --> time_str )

采用这种经验, 可以带来很多好处, 你可以顺着这条线索, Google下对应的原因

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏