PHP设置日期顺序并获取数据

PHP设置日期顺序并获取数据,php,mysql,Php,Mysql,我正在使用PHP从mysql数据库中获取日期。我想以正确的顺序设置日期,从今天日期到上一个日期,然后获取我想要的数据 以下是PHP: try { $stmt = $link->prepare("SELECT * FROM inbox LIMIT 10"); $stmt->execute(); // set the resulting array to associative $result = $stmt->setFetchMode(PDO:

我正在使用PHP从mysql数据库中获取日期。我想以正确的顺序设置日期,从今天日期到上一个日期,然后获取我想要的数据

以下是PHP:

 try {
    $stmt = $link->prepare("SELECT * FROM inbox LIMIT 10");
    $stmt->execute();

    // set the resulting array to associative
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);

    foreach($stmt->fetchAll() as $k=>$v) {
        $received_date = $v['received_date'];
        echo $received_date;
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>  
它给我这样的输出:

Fri, 31 Aug 2018 14:52:16 -0600
Mon, 13 Aug 2018 00:29:38 +0000 (UTC)
Mon, 13 Aug 2018 01:28:25 +0100
Mon, 3 Sep 2018 16:46:06 -0600
Mon, 3 Sep 2018 17:50:33 -0600
Fri, 7 Sep 2018 16:47:46 -0600
Fri, 7 Sep 2018 13:41:08 -0600
Tue, 4 Sep 2018 15:11:51 -0600
Tue, 11 Sep 2018 02:30:57 +0100
Tue, 11 Sep 2018 02:30:22 +0100
以下是我想要实现的目标:

Tue, 11 Sep 2018 02:30:57 +0100
Tue, 11 Sep 2018 02:30:22 +0100
Fri, 7 Sep 2018 16:47:46 -0600
Fri, 7 Sep 2018 13:41:08 -0600
Tue, 4 Sep 2018 15:11:51 -0600
Mon, 3 Sep 2018 17:50:33 -0600
Mon, 3 Sep 2018 16:46:06 -0600
Fri, 31 Aug 2018 14:52:16 -0600
Mon, 13 Aug 2018 01:28:25 +0100
Mon, 13 Aug 2018 00:29:38 +0000 (UTC)
我不知道如何按照正确的顺序设置日期,从今天开始,然后到上一个日期,并获取所需的数据。我使用的
received\u date
列是一个文本,因此我将它们作为字符串存储在数据库中

我想以正确的顺序设置日期,因为我想获取从今天日期到上一个日期的数据,这样我就可以在我的页面中输出它们,我可以用它来检查我的电子邮件

您能给我举个例子,说明我如何按照正确的顺序设置日期,即从今天开始的日期到我可以同时获取数据的之前日期

编辑:当我尝试此操作时:

$stmt = $link->prepare("SELECT * FROM inbox ORDER BY received_date DESC LIMIT 10");
它会给我这个:

Wed, 31 Oct 2018 11:14:38 -0400
Wed, 29 Aug 2018 16:44:17 -0400
Wed, 27 Mar 2019 21:37:05 +0000
Wed, 27 Mar 2019 03:37:05 +0000
Wed, 26 Sep 2018 18:45:40 -0400
Wed, 24 Oct 2018 23:11:11 -0400
Wed, 24 Apr 2019 19:43:06 +0100
Wed, 24 Apr 2019 01:43:07 +0100
Wed, 22 Aug 2018 16:11:48 -0400
Wed, 19 Sep 2018 19:35:45 -0400
应该是:

Wed, 24 Apr 2019 19:43:06 +0100
Wed, 24 Apr 2019 01:43:07 +0100    
Wed, 27 Mar 2019 21:37:05 +0000
Wed, 27 Mar 2019 03:37:05 +0000
Wed, 31 Oct 2018 11:14:38 -0400
Wed, 24 Oct 2018 23:11:11 -0400
Wed, 26 Sep 2018 18:45:40 -0400
Wed, 19 Sep 2018 19:35:45 -0400
Wed, 29 Aug 2018 16:44:17 -0400
Wed, 22 Aug 2018 16:11:48 -0400
以下是我在数据库中存储字符串的内容:

Wed, 31 Oct 2018 11:14:38 -0400
Wed, 29 Aug 2018 16:44:17 -0400
Wed, 27 Mar 2019 21:37:05 +0000
Wed, 27 Mar 2019 03:37:05 +0000
Wed, 26 Sep 2018 18:45:40 -0400
Wed, 24 Oct 2018 23:11:11 -0400
Wed, 24 Apr 2019 19:43:06 +0100
Wed, 24 Apr 2019 01:43:07 +0100
Wed, 22 Aug 2018 16:11:48 -0400
Wed, 19 Sep 2018 19:35:45 -0400

以这种方式创建mysql表(UTC时间,并使用此值排序):


在我看来,这个问题的基本问题是,您需要构建一个按日期排序的mySQL查询,但您有两个问题:1)您的日期是以一种奇特的格式存储的,而不是真正的mySQL datetime对象;2)您的日期不是时区标准化的。幸运的是,mysql提供了本机函数来解决这两个问题:

您的时区指示器特别麻烦,因为它们的格式是
+HHMM
,而不是全球标准
+HH:MM
(用冒号将小时与分钟分隔。因此,我们必须结合使用和将其转换为可用格式

我同意这篇文章中的其他评论者的观点,他们认为如果这些数据以更有意义的数据/时间格式存储,这个问题会更容易解决,但我也知道有时候你会被杂乱无章的数据所困扰,学习如何清理/操作不完美的数据集是编程的一部分算法:

  • 将日期字符串分为两部分:最后5个字符(时区)和其他所有字符(日期时间)
  • 将时区分割为两个额外的区块,由字符3和4之间的冒号分隔,因此
    +1200
    变为
    +12:00
  • 通过STR_TO_DATE函数传递datetime区块,将每个部分映射到相应的标记。此处的格式似乎是:
  • 转换为STR_to_日期标记此格式为:

    '%a, %d %b %Y %H:%s:%i'
    
  • 现在我们有了一个实时的datetime对象和一个有意义的时区指示器。我们将把它们传递给CONVERT_TZ以获得最终结果
  • 现在我们有了一个针对时区规范化的实时datetime对象,按该字段的顺序递减
  • 将所有这些放在一起,作为mySQL查询,如下所示:

    选择
    转换(
    截止日期(
    收到日期:,
    “%a,%d%b%Y%H:%s:%i”
    ),
    '+00:00',
    CONCAT(子字符串(接收日期-5,3),“:”,子字符串(接收日期-2,2))
    )作为日期时间
    从收件箱
    按日期时间顺序描述
    限制10
    
    原始数据:

    $stmt = $link->prepare("SELECT * FROM inbox ORDER BY received_date DESC LIMIT 10");
    

    查询结果:

    $stmt = $link->prepare("SELECT * FROM inbox ORDER BY received_date DESC LIMIT 10");
    

    @NigelRen是的,有点像,但日期并没有显示我想要实现的目标,因为它会显示像2018年10月31日11:14:38-0400 Wed,2018年8月29日16:44:17-0400什么时候应该是
    Wed,2019年4月24日19:43:06+0100 Wed,2019年4月24日01:43:07+0100
    @Script47我已经尝试过了,但它会给我不在corr中的日期ect order。请查看我更新的问题。您将希望在mysql中将日期存储为日期,以便您可以像其他人建议的那样利用
    order by
    。您可以在事后执行此操作,但除非您查询所有记录而不是10条记录,否则结果将不正确。@RobertJones最好回答一个新问题,如何将日期字符串转换为日期n mysql(或沿着这些思路)。