我有一个有列的表empname,fdate,tdate,totleave
如果员工从1月28日到2月2日请假,一共请假5天,准备工资的时候,我只想找回1月份的休假天数,那3天我只想找回,2月份剩下的天数会找回在二月份,你能告诉我如何为此编写查询吗?
这是我的查询,但它是错误的
select ((month(tdate )) - (day(fdate ))) as no_of_days,month(fdate )as month
from leavedepot
我有一个有列的表empname,fdate,tdate,totleave
如果员工从1月28日到2月2日请假,一共请假5天,准备工资的时候,我只想找回1月份的休假天数,那3天我只想找回,2月份剩下的天数会找回在二月份,你能告诉我如何为此编写查询吗?
这是我的查询,但它是错误的
select ((month(tdate )) - (day(fdate ))) as no_of_days,month(fdate )as month
from leavedepot
您可以尝试以下方法吗?它使用DateDiff()
.
select datediff(day, startdate, enddate) as no_of_days,
month(fdate )as month
from leavedepot;
编辑:SQLFIDDLE 演示
样本数据:
ID STARTDATE ENDDATE
1 2012-01-28 2012-02-02
2 2012-02-03 2012-02-10
询问:
SELECT month(startdate) as Month_Number,
datename(month, startdate) as Month, -- month is a reserved word
case when month(startdate) <> month(enddate)
then datediff(day, startdate, DATEADD(month,
((YEAR(startdate) - 1900) * 12)
+ MONTH(startdate), -1))
else datediff(day, startdate, enddate)
end
as Leaves
from myleaves
;
结果:
MONTH_NUMBER MONTH LEAVES
1 January 3
2 February 7
如果您想排除周末......:这里我们使用一个变量来定义开始结束日期,但您也可以使用您自己的表格列。:) 参考帖子:使用 sql server 获取不包括周末的 DATEDIFF。您需要将此查询合并到上述内容中。
declare @d1 datetime, @d2 datetime
select @d1 = '9/9/2011', @d2 = '9/18/2011'
select datediff(dd, @d1, @d2) - (datediff(wk, @d1, @d2) * 2) -
case when datepart(dw, @d1) = 1 then 1 else 0 end +
case when datepart(dw, @d2) = 1 then 1 else 0 end;
您仍然可以删除您的2
日期以排除 start 和 enddate...我们使用datepart的功能。
不考虑周六和周日(请用列名替换变量);
declare @fdate datetime = '20130128'
declare @tdate datetime = '20130202'
Select case
when datepart(mm,@fdate) = datepart(mm,@tdate) --check if same month
then datediff(day,@fdate, @tdate)
else datediff(day,@fdate,
convert(varchar(4),datepart(yy,@fdate)) +
right('0' + convert(varchar(2), datepart(mm,@fdate)+1),2) + '01') - 1
end
AS leavesOfMonth
这为您提供了当月的最后一天,因此您可以轻松实现
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
同样,当您计算 2 月时,您可以在下个月获得当月的第一天。
上个月的最后一天
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
此代码为您提供从 fdate 到月底的天数:
select
datediff(dd,fdate,
dateadd(dd, -1, dateadd(mm,1,cast
(cast(datepart(yy,fdate) as varchar) + '-' +
cast(datepart(mm,fdate) as varchar) + '-01'
as datetime
))))
from dbo.TST
TST 是带有日期的构造表