我得到了一份工作,用正确的数据类型在数据库中创建一个新表。以下是样本记录:
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
。
对此有何想法?
答案 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