首页 文章

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

提问于
浏览
0

我正在使用PHP和Laravel 4构建时钟应用程序 .

我的老板要求他能够根据我存储在数据库中的时间卡记录的数据来提取和构建不同的报告 .

现在我将 DateTime 存储为时钟输出和时钟输出以及时间戳,这些时间以及数据库 .

我需要能够查询数据库并为用户构建不同付费期的报告 .

因此,例如,我将存储在另一个数据库表中,记录将用于用户ID并具有不同的支付期 . 因此,开始日可能是月份的第1天和结束日期的15日,即1个付款期(大约2周)我不确定最好的方式来存储这些记录 .

另一个将是本月底的第16个月到月底 . 因此,结束日期将根据一个月中的天数而有所不同

我不确定为用户定义这些付款期的最佳方法 . 我不能简单地说 1-15 然后 16-30 ,因为 30 每月会有不同的数字 .

希望了解如何做到这一点?

因此,我可以为任何 Pay Periods 构建报告,因为并非每个用户每2周都需要获得支付灵活性,以便我可以基于每个用户进行定义

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

2 回答

  • 3

    我想你是在想这个 . 让用户定义开始和结束日期 .

    您将需要UserId,用户的时间戳(进入和超时),应该是关于它的 .

    我的照片是这样的:

    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#);
    

    如果事情的定义更少,那么你总是可以尝试做特殊的数学运算 . date('t')将为您提供一个月的天数 . 除非您的工资日固定,例如每6天支付一次,否则我不会使用此功能 .

    一般来说,我会利用PHP DateTime类的功能而不是使用date()函数 . http://php.net/manual/en/class.datetime.php

  • 1

    欢迎来到Time and Attendance的精彩世界 . 你正在触摸冰山一角 . 您可能会发现购买预包装产品可能比编写自己的产品更容易 .

    也就是说,我可以为您提供以下一般建议:

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

    • 您需要确保了解当地时间与UTC,时区和夏令时的关系 . 通常,除非您还存储其与UTC的偏移量,否则您不希望存储本地时间 . 否则,您将在夏令时变化时产生歧义 . 即使您只有一个时区可以处理,这一点也很重要 .

    • 说到付款期,常见的类型是:

    • 每周

    • 双周刊

    • 半月刊

    • 每月

    • 从Y开始每隔X天

    • 在某些系统中,每个个人的工资期可以调整/ - 从正常日期开始的几天 . 这样做时,还必须调整边界时段以进行补偿 .

    • 您应该从业务逻辑开始,该逻辑可以计算给定任何特定日期和时间的支付期间的开始和结束日期 . 然后,您可以扩展它以轻松获得之前或下一个支付期 .

    • 您可以将每个支付期存储在其中's own table, but it'不一定是必需的 . 这取决于有关系统内部的许多细节 .

    • 因为付款期限是按日期定义的,所以您有“谁的日子?”问题 . 它可能是公司定义的那一天,或者如果员工处于不同的时区,那么它可能是“逻辑日” . 如果你只有一个时区可以处理,那么你很幸运 .

    • 与支付期间进行比较时,请使用半开间隔 [start, end) . 换一种说法:

    periodStart <= punchTime < periodEnd
    

    或者同样

    periodStart <= punchTime && periodEnd > punchTime
    

    一个时期的结束应该与下一个时期的开始完全相同 . 不要试图用23:59:59.999这个愚蠢的 Value 来定义期末 .

    如您所见,这只是一个开始 . 我希望这对你有用 . 如果您可以进一步缩小问题的重点,我将很乐意提供更多帮助 . 否则,当您不确定存储库存的结构时,就像询问如何构建ERP系统一样 .

相关问题