2

我的工作是在数据库中创建一个具有正确数据类型的新表。以下是样本记录:

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.

对此有任何想法吗?

4

1 回答 1

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
于 2013-04-10T08:55:24.100 回答