Mysql STR_TO_DATE()返回无效的日期
我得到了一个任务,在数据库中创建一个数据类型正确的新表。以下是样本记录:Mysql STR_TO_DATE()返回无效的日期,mysql,sql,Mysql,Sql,我得到了一个任务,在数据库中创建一个数据类型正确的新表。以下是样本记录: RegisteredMonthYear ------------------------ May 2011 March 1998 January 2000 在插入转换后的值之前,我尝试使用STR\u to\u DATE()将其转换,以检查值是否正确,结果是否完全不是我想要的。这是我的疑问: SELECT RegisteredMonthYear, STR_TO_DATE(RegisteredMonthYe
RegisteredMonthYear
------------------------
May 2011
March 1998
January 2000
在插入转换后的值之前,我尝试使用STR\u to\u DATE()
将其转换,以检查值是否正确,结果是否完全不是我想要的。这是我的疑问:
SELECT RegisteredMonthYear,
STR_TO_DATE(RegisteredMonthYear, '%M %Y') NewDate,
STR_TO_DATE(CONCAT(RegisteredMonthYear, ' 01'), '%M %Y %d') newDate2,
STR_TO_DATE(RegisteredMonthYear, '%M %Y') + INTERVAL 1 DAY newDate3
FROM TableName
+---------------------+---------------------------------+--------------------------------+----------+
| REGISTEREDMONTHYEAR | NEWDATE | NEWDATE2 | NEWDATE3 |
+---------------------+---------------------------------+--------------------------------+----------+
| May 2011 | April, 30 2011 00:00:00+0000 | May, 01 2011 00:00:00+0000 | (null) |
| March 1998 | February, 28 1998 00:00:00+0000 | March, 01 1998 00:00:00+0000 | (null) |
| January 2000 | December, 31 1999 00:00:00+0000 | January, 01 2000 00:00:00+0000 | (null) |
+---------------------+---------------------------------+--------------------------------+----------+
有关演示,请参见此处:
如您所见,列NEWDATE
落后一天。为什么结果是这样
当我尝试在列NEWDATE2
中的字符串中连接01
时,结果与预期一致。回到NEWDATE
列,我尝试添加一天,认为它将在NEWDATE3
列中给出确切的值,但结果是NULL
你知道这个吗?你可以使用以下公式(): 我在
STR_TO_DATE()
的基础上增加了额外的DATE()
调用,但这一切都不同
但总的来说,我同意这是一个更奇怪的问题
例如,在PostgreSQL中,您不需要添加1天,也不需要额外的强制转换,简单的时间戳就足够了:
SELECT to_timestamp('May 2011', 'Mon YYYY');
2013-05-01 00:00:00-07
当我浏览文档时,它会说:
STR\u TO\u DATE()返回一个日期时间值,如果格式字符串同时包含日期和时间部分…
为什么仍要将STR\u TO\u DATE()
的结果传递到DATE()
?我猜这是STR\u TO\u DATE()的一个bug。这就是为什么我说这一个又一个MySQL抓到了。通常你需要运用黑魔法来解决那些原本不应该存在的问题。我想这也是一个bug。更新答案,为Postgres添加示例,看看它有多理智
SELECT to_timestamp('May 2011', 'Mon YYYY');
2013-05-01 00:00:00-07