Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql STR_TO_DATE()返回无效的日期_Mysql_Sql - Fatal编程技术网

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