如何显示两个月之间的分裂

时间:2013-01-03 11:10:08

标签: sql sql-server sql-server-2008

我有一个包含empname,fdate,tdate,totleave

的表格

如果员工从1月28日到2月2日休假,总共休假5天,在准备工资的时候,我想只检索1月休假日,我只想要检索3天,2月剩余的日子将在2月份检索,你能告诉我如何为此编写查询。

这是我的查询但错误

select ((month(tdate )) - (day(fdate ))) as no_of_days,month(fdate )as month 
from leavedepot  

4 个答案:

答案 0 :(得分:4)

你可以试试以下吗?它使用DateDiff()

select datediff(day, startdate, enddate) as no_of_days,
month(fdate )as month 
from leavedepot;

编辑:SQLFIDDLE DEMO

示例数据:

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

如果您想要排除周末......:这里我们使用变量来定义开始结束日期,但您也可以使用自己的表格列。 :)参考文章:get DATEDIFF excluding weekends using sql server。您需要将此查询合并到上面。

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天以排除开始和结束日期......我们使用的功能datepart

答案 1 :(得分:1)

不考虑周六&amp;星期日 (请用列名替换变量);

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

答案 2 :(得分:0)

这为您提供当月的最后一天,以便您轻松实现

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))

同样地,在计算2月份时,您可以在下个月获得当月的第一天。

上个月的最后一天

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))

答案 3 :(得分:0)

此代码显示从日期到月末的天数:

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

TEST是您的建筑日期表