STR_TO_DATE()返回无效日期

时间:2013-04-10 08:27:36

标签: mysql sql

我得到了一份工作,用正确的数据类型在数据库中创建一个新表。以下是样本记录:

RegisteredMonthYear
------------------------
May 2011
March 1998
January 2000

在我插入转换后的值之前,我尝试使用STR_TO_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)   |
+---------------------+---------------------------------+--------------------------------+----------+

点击此处查看演示:http://www.sqlfiddle.com/#!2/89a67/7

如您所见,专栏NEWDATE落后一天。结果为什么会这样?

当我尝试在01列的字符串中连接NEWDATE2时,结果符合预期。回到NEWDATE列,我尝试添加一天,认为它会在列NEWDATE3中给出确切的值,但结果为NULL

对此有何想法?

1 个答案:

答案 0 :(得分:0)

您可以使用以下公式(SQLFiddle):

SELECT date(str_to_date(RegisteredMonthYear, '%M %Y'))
     + interval 1 day
FROM tablename

我在DATE()之上添加了额外的STR_TO_DATE()电话 - 但这会产生重大影响。

但总的来说,我同意这是一个非常奇怪的MySQL问题。

例如,在PostgreSQL中,您不需要添加1天而且不需要额外的强制转换,简单的to_timestamp就足够了:

SELECT to_timestamp('May 2011', 'Mon YYYY');

2013-05-01 00:00:00-07