Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP或MySQL中查找日期是否符合时间间隔?_Php_Mysql_Datetime_Intervals - Fatal编程技术网

如何在PHP或MySQL中查找日期是否符合时间间隔?

如何在PHP或MySQL中查找日期是否符合时间间隔?,php,mysql,datetime,intervals,Php,Mysql,Datetime,Intervals,假设我有一个约会时间,2011年6月16日7:00。我希望能够在2011年8月5日7:00检查,并且能够判断它是第一个日期后1天的倍数,而7:01不算,因为它不是一个精确的倍数 另一个测试集:假设我们有2011年6月16日的7:00,我想检查一下,从那以后,某一分钟是否正好在2小时的间隔内。所以9:00、11:00、13:00等都算,但9:30和10:00不算。这可能会持续几天甚至几个月——9月1日7:00仍然算是每2小时一次。(不,目前我不知道如何处理DST:D) 我想了一会儿,想不出PHP或

假设我有一个约会时间,2011年6月16日7:00。我希望能够在2011年8月5日7:00检查,并且能够判断它是第一个日期后1天的倍数,而7:01不算,因为它不是一个精确的倍数

另一个测试集:假设我们有2011年6月16日的7:00,我想检查一下,从那以后,某一分钟是否正好在2小时的间隔内。所以9:00、11:00、13:00等都算,但9:30和10:00不算。这可能会持续几天甚至几个月——9月1日7:00仍然算是每2小时一次。(不,目前我不知道如何处理DST:D)

我想了一会儿,想不出PHP或MySQL中已经存在的任何东西可以轻松做到这一点,但见鬼,它可以做到,所以我想在我开始重新发明轮子之前抛出这个问题并询问一下

遗憾的是,这是在PHP 5.1上实现的。

MySQL日期函数:

  • 您可以使用TIME()只获取日期的时间部分。如果时间部分相同,则为精确倍数

  • 对于两小时的事情,一种方法是获取日期的分/秒部分,确保它们相等,然后确保日期的小时部分都是偶数或奇数。对于更复杂的整数(例如5)小时倍数,您可以通过除以小时部分并检查结果是否为整数来“假装”进行mod


  • 最简单的方法是将日期/时间值转换为unix时间戳,然后简单地执行一些减法/除法:

    2011-06-16 07:00:00 -> 1308229200
    2011-08-05 07:00:00 -> 1312549200
    2011-08-05 07:00:01 -> 1312549201
    
    1312549200 - 1308229200 = 4320000 / 86400 = 50 (days)
    1312549201 - 1308229200 = 4320001 / 86400 = 50.0000115...
    
    换句话说:

    if (($end_timestamp - $start_timestamp) % 864000)) == 0) {
      ... even multiple ...
    }
    

    这同样适用于日/周比较。对于几个月来说,这将是不可能的,因为几个月甚至连数字都不好处理。

    您可以通过方法比较两个DateTime对象。结果是一个对象-您可以检查两个日期之间的确切天数/小时/分钟数

    如果可以使用内置功能,那么编写自己的算法是无用的

    select *
    from test
    where datetimefield > '2011-06-16 07:00:00'
    and
    mod(timestampdiff(second,'2011-06-16 07:00:00',datetimefield),7200) = 0
    

    此示例将提供大于“2011-06-16 07:00:00”的所有记录,其中字段正好是2小时的倍数。

    Oho,这是一个好的观点。7:00永远是7:00,等等。但是,如果我说,6月15日,早上7点,我想每隔5小时打一个勾。单数,因此6月16日上午7点不符合条件。:)希望能在这几个月里。。。嗯。不过,这其实很简单:只需查看一个月的哪一天。如果相等,运行它。不要让他们把事情安排在29日、30日或31日,没有简单的“月的最后一天”的附加选项:)如果这是预订系统,并且您想限制这些类型的时间间隔,那么就不允许任意输入日期。让脚本弹出只列出允许间隔的下拉列表。不幸的是,我很抱歉没有在我的帖子中包括这一点,但我目前被困在PHP5.1中。你应该要求PHP5.3。2011年的5.1只是在浪费时间。哦,我有。但是我们被限制在RHEL5.1上,不管它是什么,它只正式支持PHP5.1。(它有5.3,但没有我们想要的插件)Timestampdiff!我们好像赢了!