mysql adddate sorunu güncelleme rekor

2 Cevap php

Ben aşağıdaki sql deyimi var:

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

start_time ve end_time Benim veritabanı (datetime) hem time alanlardır

$minuteDelta Tartışmanın aşkına 60'tır

Şu anda bir hata atmak ama 00:00:00 benim zaman alanlarını sıfırlar değildir. Bu işe gerekmez mi? Benim jQuery eklentisi bana (bir aralık) veriyor ne bir aralığını kabul etmez çünkü AddTime çalışmıyor. start_time ve end_time 14:00:00 gibi bazı değer diyelim var.

Ben bir tarihe gün ekleyerek kulüpler de benzer bir açıklama var ve iyi çalışıyor. Benim sorunum burada millet nedir?

EDIT

Entire query

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 Cevap

Bu deneyin:

$secondDelta = $minuteDelta * 60;

start_time = ADDTIME(start_time, SEC_TO_TIME($secondDelta)),
end_time = ADDTIME(end_time, SEC_TO_TIME($secondDelta))

Sorun ADDDATE, aksi eklenmesi için bir bağlam, orada bir parametre olarak tam bir tarih ve zaman gerektirmesidir. İlk parametre, bir uyarı ("kesik yanlış datetime değer") verir ve onu NULL olarak keser gibi sadece bir 01:23:45 dize / saat değerini Passing. 59:59 've ona zaman eklemek için deneyin: Ne '23 bir zaman varsa olur? Bitti dönebilirsiniz, ancak bağlam şimdi ne? Bir gün kazanmıştır? Bu sıfırlanır mı? Böyle bir hesaplamada çok fazla belirsizlik var.

Her neyse, ne istediğinizi üretecek bir işlev olarak görünmüyor. Sana bakıyoruz yakın SEC_TO_TIME ve TIME_TO_SEC olduğunu düşünüyorum. Sen böyle bir şey yapabilirsiniz:

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

Eğer ki burada bir rollover senaryo haline çalıştırırsanız, bir 24 saatlik kat fazla ile sonuna kadar:

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

O> 86400 olsaydı muhtemelen SEC_TO_TIME sonucundan 86400 çıkarılarak bir rollover ile bunun için ayarlamak olabilir böyle bir şey.:

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)
);