如何写一个条件,以便 sql 语句提取 2 小时前已解决的订单?

Posted

技术标签:

【中文标题】如何写一个条件,以便 sql 语句提取 2 小时前已解决的订单?【英文标题】:How can I word a condition so that an sql statement pulls orders that were resolved up to 2 hours ago? 【发布时间】:2019-07-16 20:50:50 【问题描述】:

我需要一个网页来显示处于活动状态且在 2 小时前发货的商品,我无法弄清楚不到 2 小时前的部分

我尝试设置一个比当前时间晚 2 小时的日期变量,并将调度的时间与该变量进行比较

$DateVar = date('Y-m-d h:i', strtotime('-2 hours'));

$sql="SELECT Id, TransactionId, WONumber, DispatchText, SentBy, Vendor, Dispatched,
             Acknowledged, TimeDispatched, Time
      FROM `DumpsterDispatch`
      WHERE (Dispatched IS NULL
      OR Acknowledged = 'N'
      OR TimeDispatched >= \"$DateVar\")
      AND Id > 1490
      ORDER BY Id DESC LIMIT 100";

我希望网页显示所有有效订单和过去 2 小时内已解决的任何订单,但是使用此代码,它会显示给定日期的所有已解决订单

【问题讨论】:

您不应该将时间从 php 注入 SQL。 mysql 有一个叫做INTERVAL 2 HOUR 的东西,你可以用它来计算时间。见:Add 2 hours to current time in MySQL? 【参考方案1】:

我建议您让 MySQL 处理它以防止与时区相关的问题。例如

SELECT Id, TransactionId, WONumber, DispatchText, SentBy, Vendor, Dispatched, Acknowledged, TimeDispatched, Time 
FROM `DumpsterDispatch`
WHERE (
    Dispatched IS NULL 
    OR Acknowledged = 'N' 
    OR TimeDispatched >= DATE_SUB(NOW(), INTERVAL 2 HOUR) 
    AND Id > 1490 
)
ORDER BY Id DESC LIMIT 100;

另一种方法是使用UNIX_TIMESTAMP(),它也会给出UTC时间戳,就像你的strtotime('-2 hours')正在做的那样。例如

$dateVar = strtotime('-2 hours');
$sql = "SELECT Id, TransactionId, WONumber, DispatchText, SentBy, Vendor, Dispatched, Acknowledged, TimeDispatched, Time
        FROM `DumpsterDispatch` 
        WHERE (
            Dispatched IS NULL 
            OR Acknowledged = 'N' 
            OR UNIX_TIMESTAMP(TimeDispatched) >= $dateVar 
        )
        AND Id > 1490
        ORDER BY Id DESC LIMIT 100";

【讨论】:

我使用 UNIX_TIMESTAMP() 实现了代码 sn-p,但它现在将显示最多 6 小时前的订单,而不仅仅是我想要的 2 小时前的订单 你能显示插入查询吗? TimeDispatched是怎么设置的? 是的,TimeDispatched 保存的日期格式为 YYYY-mm-dd h:i 我的意思是你如何插入查询;如果您使用INSERT INTO table(column) VALUES (NOW());,它应该可以工作。我认为时区在欺骗你,因为你得到了 6 小时而不是 2 小时。你可以使用date_default_timezone_get 在 PHP 中检查,在 MySQL 中使用 SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;。如果是 SYSTEM,请转到您的控制台 (Linux) 并运行 date。了解这一点很重要,否则您以后可能会遇到问题(例如 DST)【参考方案2】:

我想通了!

    $DateVar = date('Y-m-d h:i', strtotime('-2 hours'));

    $sql="SELECT data
    FROM `table`
    WHERE (Dispatched IS NULL
    OR Acknowledged = 'N'
    OR TimeDispatched >= \"$DateVar\")
    AND Id > 1490
    ORDER BY Id DESC LIMIT 100";

【讨论】:

以上是关于如何写一个条件,以便 sql 语句提取 2 小时前已解决的订单?的主要内容,如果未能解决你的问题,请参考以下文章

用sql语句如何获取当前时间,如何通过写sql语句改变数据库中的值如何通过写sql语句把数据从数据中提取出来

在MySQL中如何提取起始时间和终止时间差值大于一小时的内容?

mysql按条件分页查询的语句怎么写啊?

SQL如何按条件取唯一值?

如何写在身份证号码中提取年龄的sql语句

如何写在身份证号码中提取年龄的sql语句