关于 mysql DATE_FORMAT()函数的疑问

2020-04-28 13:57:08 +08:00
 liubx

今天些业务使用了 springjdbc,发现了 DATE_FORMAT()的一个问题:

	select (DATE_FORMAT( '2018-12-31 10:37:12', '%Y-%m') = 2019-01) 为 true
    
	select (DATE_FORMAT( '2018-12-31 10:37:12', '%Y-%m') = '2019-01') 为 false 

请问为什么会有这种结果啊?

还要为什么 jdbc 中的字符串转成 sql 后不会带上单引号,而 mybatis 会带上单引号?是 mybatis 做了这一步吗?

2711 次点击
所在节点    MySQL
5 条回复
jzmws
2020-04-28 16:02:36 +08:00
select (DATE_FORMAT( '2018-12-31 10:37:12', '%Y-%m') = DATE_FORMAT( '2019-01', '%Y-%m') ) 为 true
qwerthhusn
2020-04-28 17:25:57 +08:00
2019-01 这种东西是字面量吗?
select 2019-01 得到的却是 2018
不知道编译器怎么弄的
panzhc
2020-04-28 23:08:04 +08:00
select timestamp('2020-04-28 23:06:00') - timestamp('2020-04-28 23:05:00');
select timestamp('2020-04-28 23:06:00') - timestamp('2020-04-28 23:05:30');
qwerthhusn
2020-04-29 14:51:39 +08:00
select DATE_FORMAT( '2018-12-31 10:37:12', '%Y-%m') = 2018; #返回 1
select DATE_FORMAT( '2018-12-31 10:37:12', '%Y-%m') = '2018'; #返回 0
select DATE_FORMAT( '2018-12-31 10:37:12', '%Y-%m') = '2018-12'; #返回 1

那个 2019-01 没加引号会变成 2018,而上面的第一行也是 true
Aresxue
2020-04-30 10:50:42 +08:00
不加字符串会认为是数字, 2019-01 会被当做 2019 - 1 = 2018, 所以会不等, 加上引号才是字符串, 对于你程序来说你是 String 类型所以转成 sql 就是带引号的字符串

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666911

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX