Mysql 数据库设计--NULL或最大值来指示此日期值?

Mysql 数据库设计--NULL或最大值来指示此日期值?,mysql,datetime,timestamp,scheduling,Mysql,Datetime,Timestamp,Scheduling,所以我正在开发一个使用MySQL数据库的schedule应用程序。本网站的一个模块是供经理跟踪迟到、加班和缺勤情况。目前的网站一团糟。它只是让经理输入关键数据,但不会将经理绑定到任何已知数据(如员工预计到达/离开的时间),甚至不要求他们使用标准格式。一些经理输入30分钟(意味着迟到30分钟),而其他经理可能输入8:30(意味着他们在8:00到期),等等 我的版本会有更多的限制。经理将选择员工,然后选择有问题的班次,他们基本上能够输入两个值:实际到达的时间和实际离开的时间。这样,当运行报告并验证时

所以我正在开发一个使用MySQL数据库的schedule应用程序。本网站的一个模块是供经理跟踪迟到、加班和缺勤情况。目前的网站一团糟。它只是让经理输入关键数据,但不会将经理绑定到任何已知数据(如员工预计到达/离开的时间),甚至不要求他们使用标准格式。一些经理输入30分钟(意味着迟到30分钟),而其他经理可能输入8:30(意味着他们在8:00到期),等等

我的版本会有更多的限制。经理将选择员工,然后选择有问题的班次,他们基本上能够输入两个值:实际到达的时间和实际离开的时间。这样,当运行报告并验证时间表时,只需计算一下它们是否迟到/早退/加班。但我遇到了一个棘手的问题:

首先,如果有人打电话请病假(或者就是没来),我会让经理检查一个方框,他们根本不做任何时间调整。它只是把那段时间完全遮住了。我应该通过将两个时间值都设置为NULL来实现这一点,并且当运行任何查询时,NULL将根据需要进行处理(可能会反转剩余时间和时间到达时间,使其两端都为零),或者我应该将到达时间和剩余时间都设置为“预期的移位结束”时间,以便将其计算为零

我不喜欢使用NULL,因为它只是感觉没有可用的数据,但我不喜欢使用预期的shift end,因为它使他们看起来好像真的到达了,就在他们离开的时候


这实际上是一个如何使数据具有语义的问题,而不必使其过于复杂(使用空值)。

我认为如果没有人进来,将其标记为0分钟最有意义。因为那班他们只来了0分钟


另外,因为它是一个数值,所以实际上不需要对数据做任何特殊的处理。在我看来,这应该是收集数据的最终目标。把所有东西都统一起来,以后再做测试。如果您想提醒某人此人没有进来,只需检查时间等于0的记录。

创建一个单独的表(ShiftTimes?)如何,该表包含员工标识符、班次标识符(可能是日期,但对于第三班不起作用)以及进出时间。这样,如果员工在那里打电话,就不会有当天的记录。

NULL在这种情况下是合适的,因为它表示没有数据的现状。雇员不在那里。你还能放些什么


您应该将某种状态附加到记录中,以指示这一点,而不是查找空值(imho)。

我将它们都设置为空,并添加一个标志字段,指定它们是否出现。

我将设置空值,因为实际上没有可用数据(即没有要报告的换档开始/结束时间)


在报告中,您可以跳过这些空值并对其进行单独处理。例如,您现在可以通过计算空行来计算员工错过的班次。

我同意您应该添加一个单独的列来跟踪他们是否缺席。那么,不管你是否把开始/结束时间留在那里,这都无关紧要。您可以直接查找IsabSend标志

老实说,这真的取决于你想做得多花哨。我做过一个类似的系统,在这种情况下我们会做的是有一个单独的记录一起记录缺席情况,并确定缺席是否被原谅。因为理想情况下,除了生病或不露面之外,还有很多其他原因

如果缺勤被免除(即休假),他们应该得到报酬怎么办?我想,你的业务规则将推动这些决策


在做出任何最终决定之前,试着考虑所有可能的情况。你最终可能会发现,在这种情况下,开始和结束时间变得不相关

在我看来,一个数值的问题是,它需要非常具体地描述情况。如果他们提前到达,到达的时间是负数,如果他们迟到,则是正数。如果他们提前离开,结果是否定的,等等。他们必须考虑哪一行是哪一行。通过将其设置为时间戳,它将整个情况简化为“你何时实际出现,何时实际离开”,因此数据较少反映(从某种程度上说是判断性的)“你迟到了”,只是反映了事实。啊,我以为你在存储所花费的总时间。在这种情况下,查找记录“WHERE
Time\u start
-
Time\u end
=0”我相信这是一个有效的查询。但我考虑了一会儿,想到了用数字代替。根据你的建议,另一个问题是我不能真的说0表示没有演出,因为它不是捕捉“你在几分钟内做了多少工作”而是“你多晚/多早”,即使使用一个整数,也会呈现相同的问题。他们没有迟到90分钟到一个半小时,他们已经走了。我最后一个评论的唯一问题是,如果你用时间戳(0000-00-00:00:00)存储它,你可能无法减去。在这种情况下,您可能希望将其存储为time()值,我认为您可以使用time_SUB(date1,date2)来减去时间戳。但是是的,MySQL在减法时间的概念上变得很挑剔(比如Excel,可能是大多数计算机)。如果我理解正确的话,它的工作方式是:我有表1,这是一个员工应该工作的时间表,我有表2,它显示了他们实际工作的时间。表2不是表1关闭时的记录,而是每个人工作时的记录,reg