【问题标题】:mysql ADDDATE issue updating recordmysql ADDDATE问题更新记录
【发布时间】:2010-01-13 02:28:24
【问题描述】:

我有如下sql语句:

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

start_timeend_time 都是我数据库中的 time 字段(不是日期时间)

$minuteDelta 是 60 以供论证

现在它不会抛出错误,而是将我的时间字段重置为 00:00:00。这不应该工作吗? ADDTIME 不起作用,因为它不接受我的 jQuery 插件给我的间隔(间隔)。 start_time 和 end_time 有一些值,比如说 14:00:00。

我有一个类似的声明,我将日期添加到日期并且它工作正常。伙计们,我的问题是什么?

编辑

整个查询

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'

【问题讨论】:

  • 我很好奇您为什么要将日期与时间分开存储?如果将它们存储在一起,您的计算麻烦会少得多,查询的灵活性会更大。
  • 你知道...起初我不需要时间,但我想这无关紧要不是吗?我觉得你说的有道理。回到绘图板。

标签: php mysql time


【解决方案1】:

试试这个:

$secondDelta = $minuteDelta * 60;

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

【讨论】:

  • 这会产生正确的结果,但您的答案中有错字。删除两行中的 SELECT 就可以了。谢谢@danielrsmith!
  • 好电话,不知道为什么我首先把 SELECT 放在那里!
【解决方案2】:

问题是ADDDATE需要一个完整的日期和时间作为参数,否则没有添加的上下文。仅传递 01:23:45 字符串/时间值作为第一个参数会给出警告(“截断不正确的日期时间值”)并将其截断为 NULL。如果您有一个“23:59:59”的时间并尝试添加时间会发生什么?它可以翻转,但现在的上下文是什么?你收获了一天吗?它会重置为零吗?这样的计算有太多的歧义。

无论如何,似乎没有一个函数可以产生你想要的东西。我认为您正在查看的最接近的是SEC_TO_TIMETIME_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)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2011-08-13
    • 2011-07-17
    • 2012-11-22
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多