在PHP和MySQL中确定和存储时钟支付周期的最佳方法

在PHP和MySQL中确定和存储时钟支付周期的最佳方法,php,mysql,datetime,time-and-attendance,Php,Mysql,Datetime,Time And Attendance,我正在用PHP和Laravel4构建一个时钟应用程序 我的老板要求他能够根据我存储在数据库中的时间卡记录数据,提取并生成不同的报告 现在,我在数据库中存储了一个用于时钟输入和时钟输出的DateTime,以及这两个时间的时间戳 我需要能够查询数据库,并为不同的支付期为用户建立报告 例如,我将在另一个数据库表中存储用户ID的记录,这些记录将具有不同的付款期。因此,开始日期可能是月1日,结束日期可能是月15日,也就是1个付款期(大约2周),我不确定存储这些记录的最佳方式 另一个是本月16日至月底。因此

我正在用PHP和Laravel4构建一个时钟应用程序

我的老板要求他能够根据我存储在数据库中的时间卡记录数据,提取并生成不同的报告

现在,我在数据库中存储了一个用于时钟输入和时钟输出的
DateTime
,以及这两个时间的时间戳

我需要能够查询数据库,并为不同的支付期为用户建立报告

例如,我将在另一个数据库表中存储用户ID的记录,这些记录将具有不同的付款期。因此,开始日期可能是月1日,结束日期可能是月15日,也就是1个付款期(大约2周),我不确定存储这些记录的最佳方式

另一个是本月16日至月底。因此,根据一个月有多少天,结束日期会有所不同

我不确定为用户定义这些付款期的最佳方式。我不能简单地说
1-15
然后再说
16-30
,因为
30
每个月都是不同的数字

希望您能深入了解如何做到这一点

因此,我可以为任何
支付期构建报告
,因为不是每个用户每2周都会收到一次支付,所以需要灵活,以便我可以根据每个用户定义


这个问题更多的是关于逻辑,而不是实际的代码。

我认为您考虑得太多了。让用户定义开始和结束日期

您需要UserId,用户的时间戳(time-in和time-out),应该就是这样

我想象这样的情景:

UserId | DateIn | DateOut
在页面上,你可以放置下拉菜单(或者如果你想要一个漂亮的界面,一个使用javascript的日期选择器),允许经理选择一个他想要选择的开始和结束日期

因此,如果他想看到员工的工作时间在1月1日至2月31日之间,他可以选择这些时间作为开始和结束日期

这将使事情变得非常灵活,例如经理可以选择2月16日作为开始日期,2月29日作为结束日期。允许他选择数据需求,这样他就可以查看他想要的任何内容,这是有道理的

编辑:

下面是我的评论中的一个例子,你可以这样做:

$startDate = new DateTime();
$startDate->modify('first day of this month'); //or 16th for second part of bi-monthly
$startDate->format(#some date formatting as you need#);

$endDate = new DateTime();
$endDate->modify('last day of this month'); //or 15th for first part of bi-monthly
$endDate->format(#some date formatting as you need#);
然而,如果事情更不明确,你可以尝试做一些特殊的数学。日期('t')将给出一个月的天数。我不会使用这个,除非你的支付日是固定的,比如每6天支付一次


一般来说,我会利用PHP DateTime类的强大功能,而不是使用date()函数

我觉得你想得太多了。让用户定义开始和结束日期

您需要UserId,用户的时间戳(time-in和time-out),应该就是这样

我想象这样的情景:

UserId | DateIn | DateOut
在页面上,你可以放置下拉菜单(或者如果你想要一个漂亮的界面,一个使用javascript的日期选择器),允许经理选择一个他想要选择的开始和结束日期

因此,如果他想看到员工的工作时间在1月1日至2月31日之间,他可以选择这些时间作为开始和结束日期

这将使事情变得非常灵活,例如经理可以选择2月16日作为开始日期,2月29日作为结束日期。允许他选择数据需求,这样他就可以查看他想要的任何内容,这是有道理的

编辑:

下面是我的评论中的一个例子,你可以这样做:

$startDate = new DateTime();
$startDate->modify('first day of this month'); //or 16th for second part of bi-monthly
$startDate->format(#some date formatting as you need#);

$endDate = new DateTime();
$endDate->modify('last day of this month'); //or 15th for first part of bi-monthly
$endDate->format(#some date formatting as you need#);
然而,如果事情更不明确,你可以尝试做一些特殊的数学。日期('t')将给出一个月的天数。我不会使用这个,除非你的支付日是固定的,比如每6天支付一次


一般来说,我会利用PHP DateTime类的强大功能,而不是使用date()函数

欢迎来到这个奇妙的世界。你正触及冰山一角。您可能会发现,购买预包装产品可能比编写自己的产品更容易

也就是说,我可以向你提供以下一般性建议:

  • 在PHP和MySQL中,都要非常小心您的数据类型及其使用方式

  • 您需要确保了解本地时间与UTC、时区和夏令时。通常,您不希望存储本地时间,除非您还存储其与UTC的偏移量。否则,您将对夏令时更改产生歧义。即使只有一个时区需要处理,这一点也很重要

  • 在支付期方面,常见的类型有:

    • 周报
    • 双周
    • 半月刊
    • 月刊
    • 从Y开始每X天

  • 在某些系统中,每个单独的支付期可以在正常日期的+/-几天内进行调整。进行此操作时,还必须调整边界期以进行补偿

  • 您应该从业务逻辑开始,该逻辑可以计算给定任何特定日期和时间的付款期的开始和结束日期。然后,您可以将其扩展,以便轻松获得上一个或下一个付款期

  • 您可以将每个支付周期存储到它自己的表中,但这不是必需的。这将取决于系统内部的许多细节

  • 因为支付期是由日期定义的,所以您会遇到“今天是谁的日子”的问题。它可能是公司定义的一天,或者如果员工在不同的时区,那么它可能是“逻辑日”。如果你只有一个时区需要处理,那么在这方面你是幸运的

  • 在与付款期进行比较时,使用半开放时间间隔,
    [开始,结束)
    。换句话说:

    periodStart <= punchTime < periodEnd
    

    periodStart欢迎来到的精彩世界。您正触及冰山一角。您可能会发现购买预包装产品可能比编写自己的产品更容易