0

我需要一些关于数据库管理的帮助。我正在尝试从我的数据库中检索数据(通过created_at字段过滤它们)。

当我从今天创建的数据库中检索数据时不会有问题。

例如今天是 4/17。当我今天运行插入函数时,created_at 的值也将是 4/17。因此,当我转到我的网页并显示 4/17 的数据时,数据将是正确的。

但是假设我忘记获取 4/15 的数据,我今天需要获取这些数据。当我现在在我的数据库中插入这些数据时,created_at 将为 4/17,但相邻的数据实际上是 4/15。

现在,当我访问我的网页并显示 4/15 的数据时,我什么也得不到。

作为一种解决方法,我在表中添加了一个日期字段,这将包含一个指定的日期,这与采用服务器日期的 created_field 不同。我现在使用日期字段来过滤网页中的数据。

但是,我认为这有点多余或效率低下。有没有人有什么建议?

这是我当前表结构的屏幕截图: 在此处输入图像描述

4

2 回答 2

1

接受的答案解决了XY 问题。这可能不是解决实际问题的方法。

将当前日期时间放入数据库有很多原因(而不是数据中固有的日期时间,例如约会或出生日期)。虽然这不应该用于审计目的,但它对于调试和处理乐观锁定很方便。

但是在这里,您似乎正在寻找一种事务控制机制——一种识别哪些记录已受到某些操作的方法。如果维护记录处理顺序的记录很重要,那么日期,甚至日期时间,甚至毫秒时间戳可能都不够用。如果您需要每天多次应用此操作,会发生什么情况?如果它中途失败并且您需要恢复操作怎么办?这种机制也排除了记录可能有超过 2 个统计信息的概念。

假设正在对记录执行的操作是 ACID 事务的一部分,那么需要考虑 2 个状态 - 之前和之后。您的数据域应明确描述这两种状态(使用空/非空日期值只是隐含的)。如果事务不是原子的,那么可能会有更多的状态需要考虑。

在 MySQL 的情况下,我会将其实现为枚举数据类型(具有非空约束)。但更一般地说,我试图通过使用包含在事务中的同步操作来避免像这样更新数据的情况。

于 2019-04-17T12:12:42.170 回答
-2

由于您使用的是 Laravel,因此您可以created_at在创建模型时简单地覆盖该值。例如,您可以执行以下操作:

$myModel->created_at = Carbon::parse('2019-04-15');
$myModel->save();

这会将created_at值设置为 4 月 15 日,而不是今天。因此,您的表中不需要第二date列。

更新

尽管如此,如果您需要时间部分仍然反映当前时间,您可以执行以下操作:

$myModel->created_at = Carbon::now()->setYear(2019)->setMonth(4)->setDay(15);
$myModel->save();
于 2019-04-17T04:43:43.000 回答