【问题标题】:Count holiday days from start date for a year then every year从一年的开始日期开始计算假期天数,然后每年
【发布时间】:2016-01-11 08:40:42
【问题描述】:

您好,我将如何计算从员工入职日期起一年内休假的天数,然后之后的每一天。

Table 1 

id  name    lastname     startdate      holidays

1    jon     homes        2014-10-10      25

假期表将包含所有假期

id   empid   date

1       1    2014-12-20
2       1    2014-12-21
3       1    2014-12-22
4       1    2015-10-01
5       1    2015-10-02
6       1    2015-10-11 (this would be a new year)

如何查询 mysql 从员工开始日期计算 12 个月的假期,然后在未来每年执行此操作,而无需对日期进行硬编码。

我能理解在当年如何做到这一点

SELECT COUNT(*)
 FROM Holiday
 WHERE YEAR(date) = YEAR(CURDATE()) AND empid = 1; 

那么我如何从 startdate 2014-10-10 运行 12 个月然后每年运行查询(下一次开始日期是 2015-10-10 然后是 2016-10-10 等)

谢谢

【问题讨论】:

    标签: php mysql count


    【解决方案1】:

    您需要为此查询考虑一些数学运算。为此,我会将您的日期差 holiday_date - emp_startdate 除以一年中的天数 result/365,最后使用 CEIL 进行四舍五入。

    我也会以这种方式使用JOIN 和GROUP BY:

    SELECT 
        e.name AS Employee,
        CEIL(DATEDIFF(h.date, e.startdate)/365) as Year,
        count(h.date) as Holidays_Taken
    FROM employees AS e
    LEFT JOIN holidays_taken AS h ON e.id = h.empid
    WHERE e.id = 1
    GROUP BY Year
    

    结果:

    +----------+------+---------------+
    | Employee | Year | Holidays_Taken|
    +----------+------+---------------+
    | Jon      | 1    | 5             |
    +----------+------+---------------+
    | Jon      | 2    | 1             |
    +----------+------+---------------+
    

    演示:SQL FIDDLE

    【讨论】:

    • 好的,如果您在 2015 年 12 月 30 日和 2016 年 1 月 1 日运行查询,那么当前年份和 2015 年 10 月 10 日之间的日期会发生变化,我无法克服这一事实到 2016 年 10 月 10 日结束 2015 年和 2016 年我已经在sqlfiddle 上设置了一个演示我会看看你的解决方案谢谢
    • 我明白了。先看看我的小提琴。告诉我你的想法
    • 为小提琴演示干杯,正如您在小提琴演示中的评论中看到的那样,我将表格作为当天花费的小时数,我如何计算它们而不是天数? DEMO谢谢
    • 什么?我现在很困惑。您在原始问题中没有提到任何关于 hours 的内容。时间与开始日期有何不同?请提供详细的描述,如果与最初的问题相差太大,请打开另一个问题以便我们跟进。
    • 对时间很抱歉,但我专注于年份和日期 你的演示在时间上做得很好。年行中的另一件事而不是第 1 年我如何格式化它所以它说 2014-10-10 到 2015-10-10(第 1 年) 2015-10-10 到 2016-10-10(第 2 年) 这在查询中可能吗?再次感谢!!
    【解决方案2】:

    只需使用BETWEEN 子句:

    SELECT COUNT(*)
     FROM Holiday
     WHERE date BETWEEN '2015-10-10' AND '2016-10-10' AND empid = 1; 
    

    动态方式:

    SELECT * 
    FROM Holidays 
    WHERE date BETWEEN DATE_SUB(CONCAT(YEAR(CURDATE()), '-10-10'), INTERVAL 1 YEAR) AND CONCAT(YEAR(CURDATE()), '-10-10') 
    AND empid = 1; 
    

    编辑:相反,你必须从-1年开始。

    【讨论】:

    • 这取决于,你使用 PHP 吗?应该是存储过程吗?你喜欢用DATE_ADD(date, INTERVAL 1 YEAR)
    • 已编辑:不是年份 + 1 而是年份 -1。你不能得到+1年,因为它还不存在^^
    • 不确定你的意思:不是年 + 1 而是年 -1 我想以动态方式进行查询?间隔 - 1 年
    • 感谢您的回复刚刚运行了您的动态查询我已经设置了一个演示DEMO,您可以看到它的日期为 2014-10-24
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2019-01-06
    相关资源
    最近更新 更多