2013-06-20 2 views
0

У меня есть таблица с более чем 50 000 датами, и мне нужно преобразовать ее в поле Timestamp.Обновление столбца временной отметки на основе поля даты

Basic TableLayout:

Fieldname    Type 
+------------------------+-----------+ 
| calendar_date   | DATE  | 
| calendar_unixtimestamp | TIMESTAMP | 
+------------------------+-----------+ 

так в основном:

update calender set calendar_unixtimestamp = UNIX_TIMESTAMP(calendar_date) 

Однако, не будет работать, конечно. Поэтому я пробовал еще один вариант, который мне рассказывал на каком-то туповатом веб-сайте, кажется логичным. Однако он не может заставить его работать:

update 
    calendar t1 
    join calendar t2 on t2.`calendar_date` = t1.`calendar_date` 
set 
    t1.calendar_unixtimestamp = UNIX_TIMESTAMP(t2.`calendar_date`) 
where 
    t1.`calendar_date` = t2.`calendar_date` 

Кто-нибудь?

+0

Почему вы говорите, что это не работает? что происходит? is calendar_date столбца даты или столбца varchar? – fthiella

+0

Конечно, извините. Он ничего не обновит. Как будто ничего не случилось. Ive добавил структуру таблицы –

ответ

0

Тип данных TIMESTAMP используется для значений, содержащих как дату, так и временные части, в то время как UNIX_TIMESTAMP возвращает целое число без знака.

Вы должны установить calendar_unixtimestamp INT.

См. Скрипку here.

+0

Пятно на! Спасибо buddy –

0

Benjamin.

Я не эксперт по MySQL, но я думаю, вы должны прочитать:

http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

Особенно, когда он говорит:

По умолчанию первый столбец TIMESTAMP имеет как DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP, если они не указаны явно.

на UPDATE положение вызывает значение поля для изменения к текущей метки времени, когда обновляется запись, так что вы обновить его, то он автоматически переключается на текущую метку времени, то же самое (или почти) для всех записей в таблице.

Возможно, вам нужна колонка DATETIME. Столбец временной метки предназначен для регистрации, когда запись создается и/или обновляется. Это может быть полезно для многих целей, включая безопасность или разрешение конфликтов, когда несколько пользователей пытаются обновить одну и ту же запись.

a) Если это то, что вам нужно, вы должны сначала отключить триггер ON UPDATE, а затем сделать обновление (ваше первое было ОК), а затем повторно создать триггер (*). Просто добавьте условие WHERE, чтобы убедиться, что вы не пытаетесь обновить null. Опять же, я не уверен, что unix_timestamp - это функция, которая вам нужна.

 
    UPDATE calendar 
    SET calendar_timestamp = TIMESTAMP(calendar.date) 
    WHERE calendar_date IS NOT NULL 

b) Если это не так, вы просто должны изменить тип своего нового столбца на DATETIME.

(*) Примечание. Вероятно, было бы проще отбросить столбец, а затем создать его с помощью предложения DEFAULT, но без ON UPDATE или указать предложение NULL.

+0

Спасибо за дополнение мат, однако.Дело в том, что im в настоящее время запускает вывод timestamp на jFlot-скрипт и ему нужна метка времени. Я не хочу, чтобы каждый из них выбирал select unix_timestamp (date) из blabla. Вот почему я хотел обновить все столбцы. Значение по умолчанию для метки времени действительно current_timestamp() –

+0

Ну, тогда вы должны проверить, есть ли у вас триггер ON UPDATE. Если у вас есть это, вы должны удалить столбец, а затем воссоздать его с условием DEFAULT CURRENT_TIMESTAMP(), но без ON ONDATE. В противном случае вы не сможете обновить это поле. Извините за все изменения в моем сообщении. Я просто новый для stackoverflow :) – Clon

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