如何写一个条件,以便 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语句把数据从数据中提取出来