繁体   English   中英

MySQL:定义一个新的date列以确定在已经有created_at列的情况下获取记录的日期好吗?

[英]MySQL: Is it good to define a new date column to determine what date a record has been fetched when there is already a created_at column?

我需要有关数据库管理的帮助。 我正在尝试从数据库中检索数据(通过created_at字段进行过滤)。

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

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

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

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

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

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

这是我当前表结构的屏幕截图: 在此处输入图片说明

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

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

但是在这里,您似乎正在寻找一种事务控制机制-一种识别已对某些记录进行某些操作的方法。 如果维护记录的处理顺序的记录很重要,那么日期甚至日期时间甚至毫秒时间戳可能都不足够。 如果您每天需要多次执行此操作,会发生什么情况? 如果它在中途失败了并且您需要恢复操作怎么办? 这种机制还排除了一个记录可能有超过2个状态的想法。

假设用记录完成的事情是ACID事务的一部分,那么要考虑两种状态-之前和之后。 您的数据域应明确描述这两种状态(使用null / non-null日期值只是隐式的)。 如果交易不是原子交易,那么可能会考虑更多状态。

对于MySQL,我将其实现为枚举数据类型(具有非null约束)。 但是更笼统地说,我试图避免使用包装在事务中的同步操作来更新数据的情况。

由于您使用的是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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM