Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 其中日期\格式=日期\格式不准确_Php_Mysql_Pdo_Date Format - Fatal编程技术网

Php 其中日期\格式=日期\格式不准确

Php 其中日期\格式=日期\格式不准确,php,mysql,pdo,date-format,Php,Mysql,Pdo,Date Format,我在数据库中使用unix时间戳整数存储每次预订的时间。我遇到了一个问题,我的查询没有正确地选择内容,似乎需要休息一天 例如,在我的网站上,我有一个日历表,上面显示了一个月的每一天。我使用以下代码来填充每天的产品: $sql = "select b.*, p.name as p_name, p.color as p_color from `bookings` as b left join `products` as p on (p.id =

我在数据库中使用unix时间戳整数存储每次预订的时间。我遇到了一个问题,我的查询没有正确地选择内容,似乎需要休息一天

例如,在我的网站上,我有一个日历表,上面显示了一个月的每一天。我使用以下代码来填充每天的产品:

    $sql = "select b.*, p.name as p_name, p.color as p_color
            from `bookings` as b
            left join `products` as p on (p.id = b.id_product)
            where date_format(from_unixtime(b.timestamp), '%M %e %Y') = date_format(from_unixtime(:timestamp), '%M %e %Y')
            order by b.timestamp asc";
    $stm = $this->app->db->prepare($sql);
    $stm->bindParam(':timestamp', $this->timestamp);
    $stm->execute();
    $res = $stm->fetchAll();
现在,它显示了我在日历中1月24日第25天的预订

问题似乎在于查询的这一部分:

            where date_format(from_unixtime(b.timestamp), '%M %e %Y') = date_format(from_unixtime(:timestamp), '%M %e %Y')
例如,当
$this->timestamp='1453698000'
(第25个)和
b.timestamp='1453618800'
(第24个)在我的日历中显示25号的记录

我完全不知道为什么会这样。我尝试过将日期\u格式查询更改为使用“%d-%m-%Y”,尝试过添加“00:00:00”,尝试过在PDO构造中手动设置时区,通过使用PHP date()函数回显时间戳,确保所有时区都正确排列(它们都是)


为什么会这样?任何帮助都将不胜感激。

首先,您可以通过运行以下命令来更彻底地调试:

SELECT date_format(from_unixtime(1453698000), '%M %e %Y')

看看每个人都有什么收获。这应该揭示问题所在

我不知道您在传递unix时间戳时是如何设置时区的,但我认为这是不可能的。时区用于根据通用时间戳计算本地时间和日期

PHP认为每个时间戳位于哪个时区并不重要,这就是PHP date()函数匹配的原因。重要的是MySQL引擎所在的时区,因为这是进行转换的地方

我将根据应用程序中的正确日期时间(例如25日00:00:00)计算准确的时间戳,并将其传递给查询

转换本身:

 where date_format(from_unixtime(b.timestamp), '%M %e %Y') = date_format(from_unixtime(:timestamp), '%M %e %Y')
使时间戳上的任何索引无效,因此可能会导致性能降低

最好是这样写:

 WHERE b.timestamp >= :timestamp
   AND b.timestamp <  :timestamp + INTERVAL 1 DAY
其中b.timestamp>=:timestamp
时间戳<:时间戳+间隔1天

您的其他选项是更改。

添加10:00:00之类的时间从不添加00:00:00如果您从服务器时间获得
$this->timestanp
,您是否检查了服务器的时区并进行了适当的修改
 WHERE b.timestamp >= :timestamp
   AND b.timestamp <  :timestamp + INTERVAL 1 DAY