2014-01-06 73 views
0

在我的数据库中,我有属性“startingdate”,“endingdate”,“daterange”,“numdays”和其他几个对我的问题没有任何重要性的属性。我正在尝试建立假申请系统,允许用户申请假。如何从日期范围获取当年的天数?

属性“开始日期”和“结束日期”是相当自我解释。 “numdays”是从“开始日期”到“结束日期”的天数。至于“日期范围”,它是从开始日期到结束日期的所有日期,不包括开始日期。例如,如果开始日期是2014-01-01,结束日期是2014-01-03,则“日期范围”将是“2014-01-02 2014-01-03”。我需要这个php日历来突出显示用户已经申请的日期。

我遇到的问题是我不知道如何找到用户今年休假的天数。假设用户在2014年12月30日至2015年1月2日期间申请了假期,“日期范围”将为“2014-12-31 2015-01-01 2015-01-02”。我如何找到2014年的天数?

对不起,长期以来的问题。

+0

使用MySQL'YEAR()'函数,日期限制在一个特定的年份。 –

+0

拥有一个包含“开始日期”,“结束日期”,“日期范围”,“数日”的表似乎是冗余数据。难道你只需要存储开始日期和结束日期?然后你可以使用MySQL数据时间函数DATEDIFF()来确定numdays。 daterange和numdays似乎都违反了数据库规范化的规则。 – AgRizzo

回答

0

大概可以做得更有效率,但我会留下优化它给你。

假设条件是,endingdatestartingdate后:

select startingdate,endingdate, 
case 
when year(startingdate)=year(now()) 
and year(endingdate)=year(now()) 
then datediff(endingdate,startingdate) 
when year(startingdate)=year(now()) 
and year(endingdate)>year(now()) 
then datediff(date(concat(year(now()),'-12-31')),startingdate) 
when year(startingdate)<year(now()) 
and year(endingdate)=year(now()) 
then datediff(endingdate,date(concat(year(now()),'-01-01'))) 
when year(startingdate)<year(now()) 
and year(endingdate)>year(now()) 
then datediff(date(concat(year(now()),'-12-31')),date(concat(year(now()),'-01-01'))) 
else 0 end as daysOffThisYear 
from myTable m;