猿问

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

我正在使用我的 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_date我使用的列是文本,因此我将它们作为字符串存储在数据库中。


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


您能否向我展示一个示例,如何以正确的顺序设置从今天开始的日期到之前可以同时获取数据的日期?


小怪兽爱吃肉
浏览 156回答 2
2回答

九州编程

在我看来,这个问题的基本问题是您需要构建一个按日期排序的 mySQL 查询,但是您有两个问题:1)您的日期以一种奇特的格式存储,而不是真正的 mySQL 日期时间对象和 2)您的日期时区未标准化。幸运的是,mysql 提供了本地函数来解决这两个问题:STR_TO_DATE()CONVERT_TZ()你的时区指标特别麻烦,因为它们的格式+HHMM与全球标准相反+HH:MM(用冒号分隔小时和分钟。所以我们必须使用SUBSTRING()和的组合CONCAT()将它们转换为可用的格式。我同意该线程中的其他评论者的意见,他们建议如果这些数据以更有意义的数据/时间格式存储,这个问题会更容易,但我也知道有时你会陷入草率的数据,并学习如何清理/操作不完美的数据集是编程的一部分。考虑到这一点,我提出以下算法:将日期字符串分成两部分:最后 5 个字符(时区)和其他所有字符(日期时间)。将时区分成两个额外的块,由字符 3 和 4 之间的冒号分隔,因此+1200变为+12:00.通过 STR_TO_DATE 函数传递日期时间块,将每个部分映射到相应的标记。这里的格式似乎是:weekday_abbrev, 2_digit_month month_abrev 4_digit_year 24_base_2_digit_hour:2_digit_minute:2_digit_second转换为 STR_TO_DATE 标记,此格式为:'%a, %d %b %Y %H:%s:%i'现在我们有了一个真实的日期时间对象和一个有意义的时区指示器。我们将这两个都传递给 CONVERT_TZ 以获得最终结果。现在我们有一个为时区标准化的真实日期时间对象,按该字段排序,降序。把它们放在一起,作为一个 mySQL 查询,它看起来像:select     CONVERT_TZ(        STR_TO_DATE(            received_date,             '%a, %d %b %Y %H:%s:%i'        ),        '+00:00',        CONCAT(SUBSTRING(received_date, -5, 3), ':', SUBSTRING(received_date, -2, 2))    ) as dateTimefrom inbox order by dateTime desclimit 10原始数据:查询结果:

慕村225694

以这种方式创建mysql表(UTC时间,并以此值排序):CREATE TABLE test_timestamp (  t1  TIMESTAMP);INSERT INTO test_timestamp(t1) VALUES('2019-01-01 23:11:01');http://www.mysqltutorial.org/mysql-timestamp.aspx
随时随地看视频慕课网APP
我要回答