如何使用 Mysql If 函数来评估日期时间列?
Posted
技术标签:
【中文标题】如何使用 Mysql If 函数来评估日期时间列?【英文标题】:How to use Mysql If function to evaluate a datetime column? 【发布时间】:2019-09-26 22:18:51 【问题描述】:在返回名称列中的用户名之前,我想使用 php mysqli 准备语句评估到期日期时间列是否大于等于 Now()
日期时间。
但是我在 php 中得到了一个不正确的结果,当 expire_date
是 2019-09-27 01:00:00 而 Now()
是 2019-09-26 23:58:02 时,我得到了错误的结果。奇怪的是,当我在终端中键入查询时,我得到了想要的结果。
仅使用 Sql 查询:
mysql> SELECT IF(Now()<=expire_date, for_user, 'false') FROM forgottenleafttokens WHERE(for_user='herm' AND pass_token='9c3d5eee11f1c7cacdf676b46df87bccb650783d66afc62aee2b7f6e9382aade4ca4e1840896f788b4cff4342b4dec0842f3c577f5f61bf17fd538c7f34ca69a');
+-------------------------------------------+
| IF(Now()<=expire_date, for_user, 'false') |
+-------------------------------------------+
| herm |
+-------------------------------------------+
1 row in set (0.00 sec)
使用php:
$query = "SELECT IF(Now()<=expire_date, for_user, 'false') FROM forgottenleafttokens WHERE(for_user=? AND pass_token=?)";
$stmt = $db->prepare($query);
$stmt->bind_param('ss', $us_er, $tok_en);
$stmt->execute();
$stmt->bind_result($user);
$result = "";
if ($stmt->num_rows > 0)
while ($stmt->fetch())
$result = $user;
return $result;
else
return false;
有人可以指点我在 Sql 查询中使用的 php 准备好的语句有什么问题吗?
【问题讨论】:
【参考方案1】:mysql 服务器设置在哪个时区运行,expire_date 的类型是什么?如果是 TIMESTAMP,它正在调整时区,如果是 DATETIME,则不是。我在查询中没有看到任何错误,但是,代码有点冗长,并且没有正确迭代结果集。我试着清理一下,假设这只会返回 1 或 0 个结果。例如:限制 1;
$result = false;
if ($stmt->fetch())
$result = $user;
return $result;
如果您确实有一些自动时区转换问题,您可以使用CONVERT_TZ
函数对其进行规范化。
SELECT IF(NOW() <= CONVERT_TZ(expire_date, 'UTC', 'America/New_York'), for_user, 'false') ...
【讨论】:
@Alex Barker,时区是系统时区,根据我的 Linux 机器是 SAST(南非约翰内斯堡),而 DATETIME 是类型。谢谢,会尝试清理它。 非常感谢。清理解决了我的问题,是的,回报将永远是 1 或 0。以上是关于如何使用 Mysql If 函数来评估日期时间列?的主要内容,如果未能解决你的问题,请参考以下文章