MySQL ADDDATE выпускать обновление записи - PullRequest
2 голосов
/ 13 января 2010

У меня есть следующее заявление sql:

start_time = ADDDATE(start_time, INTERVAL $minuteDelta MINUTE), 
end_time   = ADDDATE(end_time, INTERVAL $minuteDelta MINUTE)

start_time и end_time оба поля time в моей базе данных (не дата и время)

$minuteDelta - это 60 для аргумента

Сейчас он не выдает ошибку, а сбрасывает мои поля времени на 00:00:00. Разве это не должно работать? ADDTIME не работает, потому что он не принимает интервал, который дает мне мой плагин jQuery (интервал). start_time и end_time имеют некоторое значение, например, 14:00:00.

У меня есть похожее утверждение, в котором я добавляю дни к дате, и она отлично работает. В чем моя проблема, ребята?

EDIT

Весь запрос

UPDATE events 
    SET start_date = DATE_ADD(start_date, INTERVAL 0 DAY), 
        end_date = DATE_ADD(end_date, INTERVAL 0 DAY), 
        start_time = ADDDATE(start_time, INTERVAL 60 MINUTE),
        end_time = ADDDATE(end_time, INTERVAL 60 MINUTE) 
    WHERE id='1'

Ответы [ 2 ]

1 голос
/ 13 января 2010

Проблема в том, что ADDDATE требует полной даты и времени в качестве параметра, в противном случае нет контекста для добавления. Передача только значения строки / времени 01:23:45 в качестве первого параметра выдает предупреждение («усеченное неверное значение даты-времени») и усекает его до NULL. Что произойдет, если у вас есть время '23: 59: 59 'и вы попытаетесь добавить время к нему? Это может перевернуться, но каков контекст сейчас? Вы получили день? Сбрасывается ли он на ноль? В таком расчете слишком много неопределенности.

Во всяком случае, похоже, нет функции, которая будет производить то, что вы хотите. Я думаю, что самое близкое, на что вы смотрите - это SEC_TO_TIME и TIME_TO_SEC . Вы можете сделать что-то вроде этого:

SELECT SEC_TO_TIME(TIME_TO_SEC('23:30:00') + 60);
-- returns 23:31:00

Однако, если вы столкнетесь с сценарием опрокидывания, вы получите время, превышающее 24-часовые часы:

SELECT SEC_TO_TIME(TIME_TO_SEC('23:59:30') + 60);
-- returns 24:00:30

Вы, вероятно, могли бы скорректировать это с помощью ролловера, вычтя 86400 из результата SEC_TO_TIME, если он был> 86400. Примерно так:

SELECT IF(
    TIME_TO_SEC('23:54:30') + 60 > 86400,
    SEC_TO_TIME(TIME_TO_SEC('23:54:30') + 60 - 86400),
    SEC_TO_TIME(TIME_TO_SEC('23:54:30') + 60)
);
1 голос
/ 13 января 2010

Попробуйте это:

$secondDelta = $minuteDelta * 60;

start_time = ADDTIME(start_time, SEC_TO_TIME($secondDelta)),
end_time = ADDTIME(end_time, SEC_TO_TIME($secondDelta))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...