2013-04-10 4 views
2

Мне было задано задание для создания новой таблицы в базе данных с правильным типом данных. Здесь приведены примеры записей:STR_TO_DATE() возвращает недопустимую дату

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

Вы можете использовать следующую формулу (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 
+1

как я просматривать документацию, она говорит: 'STR_TO_DATE() возвращает значение DATETIME, если строка формата содержит как дату, так и время ... 'почему вы все еще передаете результат' STR_TO_DATE() 'в' DATE() '? Я предполагаю, что это ошибка для 'STR_TO_DATE()'. –

+1

Вот почему я сказал, что это еще один MySQL. Часто вам нужно применять черную магию для решения проблем, которые не должны существовать на первом месте. – mvp

+0

Я думаю, это тоже ошибка. –

Смежные вопросы