MySQL DATETIME 在一个表中显示正确的日期,但在另一个表中显示不正确的时间(总是午夜)?

Posted

技术标签:

【中文标题】MySQL DATETIME 在一个表中显示正确的日期,但在另一个表中显示不正确的时间(总是午夜)?【英文标题】:MySQL DATETIME shows correct date, but incorrect time (always midnight) in one table but not in another table? 【发布时间】:2022-01-12 00:39:31 【问题描述】:

我正在使用 mysqlDATETIME 在数据库中的两个不同表中设置日期和时间(使用 php)。其中一个实例位于users 表中,并记录此人注册帐户的时间以及他们上次登录的时间。另一种用法是在单独的messages 表中(在同一数据库中),该表记录何时用户向另一个用户发送消息。

虽然 MySQL DATETIME 代码在每个表中都是相同的,但在 messages 表上它记录了日期,但发送消息的时间总是正好是午夜,例如2021-12-06 00:00:00

在 PHPmyAdmin 中,我使用的是DATETIME,在两个表中都没有默认值且不为空。

每种用法的 PHP 准备语句如下。如您所见,我正在使用current_date 函数。

示例 1 users 表(时间已正确记录在数据库中)。注意:fname 等一些变量来自表单元素。我没有包含表单代码以使代码更简单。

$passwordHash = password_hash($pword, PASSWORD_DEFAULT);

$sql = "INSERT INTO lj_users 
            (firstname, lastname, email, username, password, 
            date_registered, last_login, active, profile_image, 
            permissions) 
        VALUES (:firstname, :lastname, :email, :username, :password, 
                current_date, current_date, 0, '', 
                'standard' )";

$stmt = $connection->prepare($sql);

$stmt->bindParam(':firstname', $fname);
$stmt->bindParam(':lastname', $lname);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':username', $uname);
$stmt->bindParam(':password', $passwordHash);

$stmt->execute();   

示例 2(时间未正确记录在数据库中)

$message_sql = "INSERT INTO lj_messages 
                    (message_title, message_body, dm_recipient_id, 
                    dm_sender_id, message_date) 
                VALUES (:message_title, :message_body, :dm_recipient_id, 
                        :dm_sender_id, current_date )";

$stmt = $connection->prepare($message_sql);

$stmt->bindParam(':message_title', $dm_title);
$stmt->bindParam(':message_body', $dm_body);
$stmt->bindParam(':dm_recipient_id', $dm_recipient_id);
$stmt->bindParam(':dm_sender_id', $dm_sender_id);
$stmt->execute();

我完全不知道为什么会这样。

【问题讨论】:

因为current_date 就是:约会。为什么它在另一张桌子上工作,我不能说。如果您想要日期时间,请改用now() @aynber - 感谢您解决了messages 表中的问题。为什么current_date 在用户表中的注册页面上工作?我不明白? date_registered and last_login 是 DATE 类型而不是 DATETIME @RiggsFolly 不,它在所有情况下都是 DATETIME 类型 仔细检查show create table `messages`,看看这些字段是否有默认值。 【参考方案1】:

current_date 只返回一个日期:

mysql> select current_date; 
+--------------+                                                                                                                                                                                                            
| current_date |                                                                                                                                                                                                            
+--------------+                                                                                                                                                                                                            
| 2021-12-07   | 
+--------------+

你想要now(),它返回一个日期时间。

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-12-07 09:33:40 |
+---------------------+

【讨论】:

以上是关于MySQL DATETIME 在一个表中显示正确的日期,但在另一个表中显示不正确的时间(总是午夜)?的主要内容,如果未能解决你的问题,请参考以下文章

DataTable 不接受 MySQL 表中的 DateTime 字段

DATETIME在表中的MySQL搜索记录[重复]

mysql中Timestamp,time,datetime 区别??

选择表中每分钟的第一个值

SQLite datetime('now')

MySQL 更新一个字段,表中的其他datetime类型字段全部变成了当前时间。