我对SQL和PHP中的日期比较逻辑有一个问题:日期差异函数对于相同的日期返回不同的结果.示例:

SQL

SELECT DATEDIFF('2024-06-02', '2024-05-03 12:57')
30

PHP

$x = date_diff( new DateTime( '2024-06-02' ), new DateTime( '2024-05-03 12:57' ) );

enter image description here

当我将从DB中 Select 的具有where DATEDIFF...标准的数据传递给使用date_diff()函数判断日期的PHP时,这会导致断言错误.

PHP中是否有一个严格的等效函数(反之亦然),以便两者都返回29(或30)?

推荐答案

您在这里本质上使用了两个具有不同目的和机制的函数.

MySQL DATEDIFF()

此函数完全忽略时间戳.因此,即使重叠时间会增加或删除一天,这也是无关紧要的,因为它只是将它们go 掉,然后计算dates天之间有多少天.因此,无论这两个部分的时间如何,SQL都会始终返回30.

PHP date_diff()

该函数判断两个Date Time对象之间存在的总时间-这里重要的是,它还考虑了整个时间,这意味着您可以在答案中获得从近29天到近31天的整个范围,具体取决于两个时间戳中的一天中的时间.

Solutions

这个问题缺少的是你会发生什么.因此,以下是处理这个问题的两种方法.要么:a)告诉PHP做与PHP相同的事情,并比较时间段,或者b)告诉PHP做与SQL相同的事情,并忽略时间.

100

使用DAYTIMESTAMPDIFF()来获取时间戳之间的全天数,而不是DATEDIFF().

SELECT
    TIMESTAMPDIFF(DAY, '2024-05-03 12:57', '2024-06-02') AS days;

这是与PHP相同的SQL:

echo date_diff(
    new DateTime("2024-06-02"),
    new DateTime("2024-05-03 12:57")
)->days;

两人都会回归:29

100

然后你的SQL:

SELECT
    DATEDIFF('2024-06-02', '2024-05-03 12:57') AS days;

相当于在PHP中删除时间(好吧,将其设置为00:00):

echo date_diff(
    (new DateTime("2024-06-02"))->setTime(0, 0), 
    (new DateTime("2024-05-03 12:57"))->setTime(0, 0) 
)->days;

两者都会输出:30

Php相关问答推荐

PHP Mail到Googlmail.仅SPF

显示根据WooCommerce单变量产品中的数量计算得出的汇总

条纹 checkout :订阅试用版和额外付款(add_invoice_items)错误

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

获得客户S在WooCommerce为期1年的总支出

WooCommerce基于元数据的自定义范围目录排序

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

Php解压缩deflate64

多行PHP属性声明中是否允许单行注释

PHP测试字符串的所有POST值

WHERE方法不能与有效查询Laravel一起使用

将数据推入所有子数组条目

PHP Match如何准确判断条件?

用ajax获取文件 - CORS问题&;设置缓存?

致命错误:未捕获 Google_Exception:客户端机密 JSON 文件无效.在 /somepath/lib/vendor/google/apiclient/src/Google/Client.php

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

为WooCommerce中的Guest用户保存唯一的客户代码到订单中

Laravel的Storage::exists返回false,而file_exists返回true.

适当的时区处理 Laravel / Carbon

PHP 将数组值插入到 csv 列