为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
小怪兽爱吃肉 2022-01-14 16:05:20
我正在使用我的 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 -0600Mon, 13 Aug 2018 00:29:38 +0000 (UTC)Mon, 13 Aug 2018 01:28:25 +0100Mon, 3 Sep 2018 16:46:06 -0600Mon, 3 Sep 2018 17:50:33 -0600Fri, 7 Sep 2018 16:47:46 -0600Fri, 7 Sep 2018 13:41:08 -0600Tue, 4 Sep 2018 15:11:51 -0600Tue, 11 Sep 2018 02:30:57 +0100Tue, 11 Sep 2018 02:30:22 +0100这是我想要实现的目标:Tue, 11 Sep 2018 02:30:57 +0100Tue, 11 Sep 2018 02:30:22 +0100Fri, 7 Sep 2018 16:47:46 -0600Fri, 7 Sep 2018 13:41:08 -0600Tue, 4 Sep 2018 15:11:51 -0600Mon, 3 Sep 2018 17:50:33 -0600Mon, 3 Sep 2018 16:46:06 -0600Fri, 31 Aug 2018 14:52:16 -0600Mon, 13 Aug 2018 01:28:25 +0100Mon, 13 Aug 2018 00:29:38 +0000 (UTC)我不知道如何以正确的顺序设置日期,从今天开始,然后到前一个日期,并获取我想要的数据。received_date我使用的列是文本,因此我将它们作为字符串存储在数据库中。我想以正确的顺序设置日期,因为我想获取从今天日期到前一个日期的数据,这样我就可以将它们输出到我的页面中,在那里我可以使用它来检查我的电子邮件。您能否向我展示一个示例,如何以正确的顺序设置从今天开始的日期到之前可以同时获取数据的日期?
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

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

你的时区指标特别麻烦,因为它们的格式+HHMM与全球标准相反+HH:MM(用冒号分隔小时和分钟。所以我们必须使用SUBSTRING()和的组合CONCAT()将它们转换为可用的格式。

我同意该线程中的其他评论者的意见,他们建议如果这些数据以更有意义的数据/时间格式存储,这个问题会更容易,但我也知道有时你会陷入草率的数据,并学习如何清理/操作不完美的数据集是编程的一部分。考虑到这一点,我提出以下算法:

  1. 将日期字符串分成两部分:最后 5 个字符(时区)和其他所有字符(日期时间)。

  2. 将时区分成两个额外的块,由字符 3 和 4 之间的冒号分隔,因此+1200变为+12:00.

  3. 通过 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'
  1. 现在我们有了一个真实的日期时间对象和一个有意义的时区指示器。我们将这两个都传递给 CONVERT_TZ 以获得最终结果。

  2. 现在我们有一个为时区标准化的真实日期时间对象,按该字段排序,降序。

把它们放在一起,作为一个 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 dateTime

from inbox 

order by dateTime desc

limit 10

原始数据:

//img1.sycdn.imooc.com//61e12ef500015b3c02470102.jpg

查询结果:

//img1.sycdn.imooc.com//61e12f00000126fa05860356.jpg



查看完整回答
反对 回复 2022-01-14
?
慕村225694

TA贡献1880条经验 获得超4个赞

以这种方式创建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


查看完整回答
反对 回复 2022-01-14
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信