gpt4 book ai didi

PHP 显示工资单日期

转载 作者:太空宇宙 更新时间:2023-11-03 12:16:08 25 4
gpt4 key购买 nike

我有一个页面需要显示滚动工资类型的日期。有问题的工资单在月末 1 日至 15 日和 16 日运行。我有一个显示当前工资单的页面,其中包含一个向前或向后的按钮。我有以下大部分时间都有效的代码,但偶尔会跳过支付期。有更好的方法吗?

//find out what the offset is for the pay period we want to see
$offset = $_GET['offset'];
$offsetdays = $offset * 15;

//Find out what day it is
$dayofmonth = date('j', mktime( 0, 0, 0,date("m"), -$offsetdays, date("Y")));

//if it is the second half of the month set the pay period to be the 1-15th of this month
if($dayofmonth <= 15){
//Echo display dates in HTML
Echo "<div style='width:15%; float:right; text-align:center'>Pay Period End Date <BR>";
echo date("m/d/Y", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), -$offsetdays, date("2014"))), 15, date("2014"))); //End Date
Echo "</div> <div style='width:1%; float:right; text-align:center'>|<BR>|</div>";
Echo "<div style='width:15%; float:right; text-align:center'>Pay Period Start Date <BR>";
Echo date("m/d/Y", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), -$offsetdays, date("2014"))), 1, date("2014"))); //Start Date
Echo "</div>";
Echo "<BR>";

//Set variable dates for SQL
$checkoffset = offsetdays - 15;
$payrollstartdate = date("Y-m-d", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), - $offsetdays, date("2014"))), 1, date("Y")));
$payrollenddate = date("Y-m-d", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), - $offsetdays, date("2014"))), 15, date("Y")));
$checkdayte = date("m/d/Y", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), - $checkoffset, date("2014")))+1, 0, date("Y")));
}


//if it is the first half of the month set the pay period to be the 16- end of this month
if($dayofmonth > 15){
//Echo display dates in HTML
Echo "<div style='width:15%; float:right; text-align:center'>Pay Period End Date <BR>";
echo date("m/d/Y", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), -$offsetdays, date("2014")))+1, 0, date("2014"))); //End Date
Echo "</div> <div style='width:1%; float:right; text-align:center'>|<BR>|</div>";
Echo "<div style='width:15%; float:right; text-align:center'>Pay Period Start Date <BR>";
echo date("m/d/Y", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), -$offsetdays, date("2014"))), 16, date("2014"))); //Start Date
Echo "</div>";
Echo "<BR>";

//Set variable dates for SQL
$checkoffset = offsetdays - 15;

$payrollstartdate = date("Y-m-d", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), - $offsetdays, date("2014"))), 16, date("2014")));
$payrollenddate = date("Y-m-d", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), - $offsetdays, date("2014")))+1, 0, date("2014")));
$checkdayte = date("m/d/Y", mktime(0, 0, 0, date("m", mktime( 0, 0, 0,date("m"), -$checkoffset, date("2014"))), 15, date("2014")));
}

将偏移量增加 1 将显示下一个支付周期,而将其减少一个将显示最后一个。

我也曾尝试在 MySQL 中执行此操作,但运气不佳。

在这里更详细一点是我希望发生的事情:

今天(2/27),当我转到页面时,我需要开始日期为 2/15/2014,结束日期为 2/28/2014。当我增加偏移量变量时,我需要将开始日期设置为 2014 年 3 月 1 日,将结束日期设置为 2014 年 3 月 15 日。

下周二 (3/4) 当我转到此页面时,我需要将开始日期设置为 2014 年 3 月 1 日,将结束日期设置为 2014 年 2 月 15 日。当我增加偏移量变量时,我需要将开始日期设置为 2014 年 3 月 15 日,将结束日期设置为 2014 年 3 月 31 日。

最佳答案

这是解决此问题的以 MySQL 为中心的方法。它基于使用每个间隔的开始日期有效地描述日期间隔的想法。

薪资业务规则所需的时间间隔是发薪期——“半”个月——定义为从 YYYY-mm-01 和 YYYY-mm-16 开始。

因此,给定任意时间戳,例如 NOW()1941-12-07 08:00 ,我们需要一种方法来确定支付期的开始日期。有一个 MySQL 存储函数来执行此操作会很方便,这样

 BIMONTHLY_PAY_PERIOD_START('1941-12-07 08:00') produces '1941-12-01'

 BIMONTHLY_PAY_PERIOD_START('2014-03-20 20:50') produces '2014-03-16'

这是该存储函数的定义。

DELIMITER $$

DROP FUNCTION IF EXISTS `BIMONTHLY_PAY_PERIOD_START`$$

CREATE FUNCTION `BIMONTHLY_PAY_PERIOD_START` (datestamp DATETIME)
RETURNS DATE
NO SQL
DETERMINISTIC
COMMENT 'returns first day of bimonthly pay period: 1,16 of month'
BEGIN
DECLARE dy INT;
SET dy = DAY(datestamp);
IF dy<=15
THEN SET dy=0;
ELSE SET dy=15;
END IF;
RETURN (DATE(DATE_FORMAT(datestamp, '%Y-%m-01')) + INTERVAL dy DAY);
END$$
DELIMITER ;

基本上,它是通过找到该月的第一天然后在必要时将其偏移 15 天来实现的。

接下来,我们需要一个函数,给定一个支付期(请记住,它是由第一天定义的)来向前或向后移动特定数量的支付期。例如

BIMONTHLY_PAY_PERIOD_ADD('1941-12-01', -1) goes back one period to '1941-11-16'

BIMONTHLY_PAY_PERIOD_ADD('2014-03-16', 3) goes forward three to '2014-05-01'

下面是该函数的定义:

DELIMITER $$
DROP FUNCTION IF EXISTS `BIMONTHLY_PAY_PERIOD_ADD`$$

CREATE FUNCTION `BIMONTHLY_PAY_PERIOD_ADD`(datestamp DATETIME, incr INT)
RETURNS DATE
NO SQL
DETERMINISTIC
COMMENT 'returns first day of a pay period in the future or past'
BEGIN
DECLARE pp DATE;
SET pp = BIMONTHLY_PAY_PERIOD_START(datestamp);
IF ABS(incr) MOD 2 = 1
THEN
SET pp = pp + INTERVAL 16 DAY;
SET incr = incr - 1;
END IF;
SET incr = incr DIV 2;
SET pp = pp + INTERVAL incr MONTH;
RETURN BIMONTHLY_PAY_PERIOD_START(pp);
END$$

DELIMITER ;

利用每个月有两个支付期的洞察力,它可以稳定地工作,不会跳过支付期。

最后,您需要一种在 SQL 逻辑中使用这些支付期日期的方法。例如,假设您有一个包含

的工资单记录表
employee_id  INT          identifies the employee
clock_in DATETIME the date and time the employee clocked in
clock_out DATETIME the date and time the employee clocked out

并且您想要按员工和最近六个完整支付周期的支付周期汇总在职分钟数。也就是说,您想要排除当前未完成的支付期间的在职分钟数。

你这样做:

SELECT employee_id, 
BIMONTHLY_PAY_PERIOD_START(clock_out) AS pay_period,
SUM(TIMESTAMPDIFF(MINUTE,clock_in, clock_out)) AS minutes_worked
FROM payroll_data
WHERE clock_out >= BIMONTHLY_PAY_PERIOD_ADD(NOW(), -6)
AND clock_out < BIMONTLY_PAY_PERIOD_START(NOW())
GROUP BY employee_id, BIMONTHLY_PAY_PERIOD_START(clock_out)
ORDER BY employee_id, BIMONTHLY_PAY_PERIOD_START(clock_out)

此查询使用我们定义的函数来确定每天的工作属于哪个支付期。注意它使用了 >=它需要的日期范围开始的比较运算符,以及 <运算符与日期范围之后的日期相结合以处理日期范围的结束。

如果您需要当前支付期的最后一天,那很容易。这是下一个支付周期开始的前一天。

BIMONTHLY_PAY_PERIOD_ADD(NOW(),1) - INTERVAL 1 DAY

这种处理日期算术的方法非常稳健且速度相当快。它利用 MySQL 的有用功能,如日期范围索引搜索和聚合 (GROUP BY) 查询。您应该能够将它与客户端代码 (php) 相结合,以很好地展示您的信息。

关于PHP 显示工资单日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com