如何使用 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 函数来评估日期时间列?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 计算两个日期的时间差函数小时分钟格式

如何跨表格取满足条件的某一列数据的最小日期的函数

如何从日期中查找整个日期列的工作日

mysql语句如何传递日期参数 - 技术问答

如何评估作为列值的表达式?

需要帮助来订购我的 MySQL 表中的时间和日期列