Sql 如何显示两个月之间的天数分割

Sql 如何显示两个月之间的天数分割,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个包含列empname、fdate、tdate、totlave的表 如果员工从1月28日到2月2日休假,总共休假5天,在准备工资时,我只想检索1月的休假天数,我只想检索3天,2月的剩余天数将在2月检索,您能告诉我如何为此编写查询吗 这是我的问题,但它是错误的 select ((month(tdate )) - (day(fdate ))) as no_of_days,month(fdate )as month from leavedepot 这将为您提供当月的最后一天,因此您可以轻

我有一个包含列
empname、fdate、tdate、totlave的表

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

这是我的问题,但它是错误的

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

这将为您提供当月的最后一天,因此您可以轻松实现它

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
同样,在计算二月时,您可以在下个月获得当前月份的第一天

上月最后一天

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

这将为您提供当月的最后一天,因此您可以轻松实现它

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
同样,在计算二月时,您可以在下个月获得当前月份的第一天

上月最后一天

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

你能试试下面的吗?它使用

编辑:

样本数据:

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
    ;
如果您想排除周末的话…:这里我们使用一个变量来定义开始-结束日期,但是您也可以使用自己的表列来定义它。:)参考职位:。您需要将此查询合并到上述查询中

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

您可以尝试以下操作吗?它使用

编辑:

样本数据:

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
    ;
如果您想排除周末的话…:这里我们使用一个变量来定义开始-结束日期,但是您也可以使用自己的表列来定义它。:)参考职位:。您需要将此查询合并到上述查询中

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
天,以排除我们使用的开始日期和结束日期…函数。

此代码提供从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是包含日期的施工表

此代码提供从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是包含日期的构造表,不考虑周六和周日(请用列名替换变量)

不考虑周六和周日(请用列名替换变量)


周六和周日怎么样?它们也算吗?星期六和星期天怎么样?它们也算上了吗?请看一下这里的所有三个样本,如果你需要进一步澄清,请评论哪一个最适合你。你在考虑日期是否在同一个月吗?@Kaf我正在更新我的帖子,添加
sqlfiddle
:)你以前没有考虑过用户在查询中的要求。你的第二个问题和我的差不多了。@Kaf不认为我复制了你,完全不同的方法;)如果您需要进一步澄清,请查看这里的所有三个示例,并对最适合您的示例进行评论。您是否正在考虑日期是否在同一个月?@Kaf我正在更新我的帖子以添加
sqlfiddle
:)您以前没有考虑用户在查询中的要求。你的第二个问题和我的差不多了。@Kaf不认为我复制了你,完全不同的方法;)