SELECT PER_ID, SUM(DATEDIFF(DAY, DATE_S, DATE_E) + 1) AS [DAYS_ABSENT],
MONTH(DATE_S) AS [MONTH], YEAR(DATE_S) AS [YEAR]
FROM #ABSENT
WHERE DATE_E IS NOT NULL
GROUP BY PER_ID, MONTH(DATE_S), YEAR(DATE_S);
要默认为今天:
SELECT PER_ID, SUM(DATEDIFF(DAY, DATE_S, COALESCE(DATE_E, GETDATE())) + 1) AS [DAYS_ABSENT],
MONTH(DATE_S) AS [MONTH], YEAR(DATE_S) AS [YEAR]
FROM #ABSENT
GROUP BY PER_ID, MONTH(DATE_S), YEAR(DATE_S);
1条答案
按热度按时间xxe27gdn1#
我想这是一个关于我昨天对"整个月缺席-SQL数据库管理系统“问题的回答的问题。为了连贯起见,你应该对这个答案发表评论。
你问应该错在哪里:
您提到
DATE_E
可能是NULL
。这部分查询是针对ABSENT
表的。如果您不知道某个雇员的缺勤结束日期,那么您应该怎么做?您可以添加一个WHERE
子句,并忽略具有缺勤结束日期的雇员(可能是因为他们还没有返回工作岗位),或者您可以将其默认为今天,或者您可以执行您认为适当的其他操作。若要忽略这些值:
要默认为今天:
最后,要获取该月的最后一天,只需
如果
DATE_S
的值实际上类似于2019-05
,那么它一定不是DATE
(因为它不是有效的DATE
),而是某种类型的文本。我们知道一个月中总会有一天是第一天,所以你可以这样做:在对whole absent month-SQL DBMS的回答中,我使用了
DAY(EOMONTH(DATE_S))
,因为这是获取一个月中天数的最简单方法--找到该月的最后一天,然后获取该天,即该月的天数。如果答案解决了您的问题,请将其标记为已接受,如果您需要更多说明,请对答案进行评论。