2012-01-19 1 views
2

Я думал, что столкнулся с ошибкой с MySQL 5.1, но ошибка была в Perl-коде, который создает временные метки. Местное время perl использует 0-11 в течение нескольких месяцев, но MySQL datetime использует 1-12. Итак, у меня есть все эти неверные временные метки, которые мне нужно обновить.MySQL - мои месяцы хранятся в актуальном состоянии 0-11

2012-00-19 09:03:30 

Это должно быть:

2012-01-19 09:03:30 

Проблема заключается в том, что дата функции для MySQL возврата NULL на 00 месяц. Есть ли способ сделать это в MySQL?

EDIT: Решение =

UPDATE test_stats 
SET start_time = CAST(CONCAT(SUBSTRING(start_time, 1, 5), 
         CAST((CAST(SUBSTRING(start_time, 6, 2) AS UNSIGNED) + 1) AS CHAR(2)), 
         SUBSTRING(start_time, 8, 12)) AS DATETIME); 

Кстати, я использую MySQL 5.1

+2

OK , Я люблю Perl, но кто думал, что это было просто d идеализировать месяцы с нулевым индексом? –

+0

Вы можете попробовать использовать функцию [dateadd] (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add) в MySQL, чтобы добавить месяц каждая запись. Я не уверен, что произойдет в нулевых случаях; вам нужно попробовать его в командной строке MySQL, чтобы узнать. –

+1

Perl gmtime/localtime по существу берет структуру Unix tm как свой параметр, а struct tm имеет индексы с нулевым индексом. Это довольно печально известный Perl, но это действительно вина Unix. – pndc

ответ

3

Это должно работать:

UPDATE MyTable 
SET DateTimeField = 
    CAST (
    SUBSTRING(DateTimeString, 1, 5) -- '2012-' 
    + CAST((CAST(SUBSTRING(DateTimeString, 6, 2) AS INT) + 1) AS VARCHAR) -- '00' => '1' 
    + SUBSTRING(DateTimeString, 8, 12) -- '-19 09:03:30' 
    AS DATETIME) 

Test с этим выберите

DECLARE @x VARCHAR(50) = '2012-00-19 09:03:30' 

SELECT CAST(SUBSTRING(@x, 1, 5) 
    + CAST((CAST(SUBSTRING(@x, 6, 2) AS INT) + 1) AS VARCHAR) 
    + SUBSTRING(@x, 8, 12) AS DATETIME) 
+0

Итак, это обновит любой 00-й месяц, не так ли? Чтобы увеличить все значения месяца, так как все они в настоящее время хранятся как 0-11, мне сначала нужно обновить и увеличить каждый не-00 месяцев, правильно? – kjprice

+0

да, это увеличит месяцы 0 => 1, 1 => 2, ...., 11 => 12 –

+0

Давайте посмотрим, можно ли сначала проверить его, выполнив выбор: SELECT CAST (SUBSTRING (DateTimeString, 1, 5) - '2012-' + CAST ((CAST (SUBSTRING (DateTimeString, 6, 2) AS INT) + 1) AS VARCHAR) - '00' => '1' + SUBSTRING (DateTimeString, 8, 12) - '-19 09:03:30' AS DATETIME) FROM MyTable; ? – kjprice