Sql server 查找SQL Server中的日期差异

Sql server 查找SQL Server中的日期差异,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我的表中有开始日期和截止日期,我想知道SQL Server 2008中两个日期之间没有星期日的总天数 给我一个问题 接受我的问题…好的,那么计算出总天数,减去总周数,并在起始日期为周日的情况下计算一个小提琴系数: SELECT DATEDIFF(dd, FromDate, ToDate) -DATEDIFF(wk, FromDate, ToDate) -(CASE WHEN DATEPART(dw, FromDate) = 1 THEN 1 ELSE 0 END) 好的,算出总天

我的表中有
开始日期
截止日期
,我想知道SQL Server 2008中两个日期之间没有星期日的总天数

给我一个问题


接受我的问题…

好的,那么计算出总天数,减去总周数,并在起始日期为周日的情况下计算一个小提琴系数:

SELECT
   DATEDIFF(dd, FromDate, ToDate)
  -DATEDIFF(wk, FromDate, ToDate)
  -(CASE WHEN DATEPART(dw, FromDate) = 1 THEN 1 ELSE 0 END)

好的,算出总天数,减去总周数,对于起始日期为周日的情况,计算一个小提琴系数:

SELECT
   DATEDIFF(dd, FromDate, ToDate)
  -DATEDIFF(wk, FromDate, ToDate)
  -(CASE WHEN DATEPART(dw, FromDate) = 1 THEN 1 ELSE 0 END)

试着用这个例子来说明问题

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2008/10/01'
SET @EndDate = '2008/10/31'


SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)

试着用这个例子来说明问题

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2008/10/01'
SET @EndDate = '2008/10/31'


SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)

您可以使用CTE实现这一点,并且可以轻松地将其转换为标量函数:

DECLARE @startDate DATETIME = '2011-09-01'
DECLARE @endDate DATETIME = '2011-09-23'

;WITH DateRange (date) AS
(
    SELECT @startDate 
    UNION ALL
    SELECT Date+1
    FROM DateRange
    WHERE date<@endDate
)
SELECT COUNT(*) FROM DateRange WHERE DATENAME(dw,Date) != 'Sunday'
用法:

SELECT dbo.NumberOfDaysExcludingSunday(startDate,endDate)
FROM myTable

您可以使用CTE实现这一点,并且可以轻松地将其转换为标量函数:

DECLARE @startDate DATETIME = '2011-09-01'
DECLARE @endDate DATETIME = '2011-09-23'

;WITH DateRange (date) AS
(
    SELECT @startDate 
    UNION ALL
    SELECT Date+1
    FROM DateRange
    WHERE date<@endDate
)
SELECT COUNT(*) FROM DateRange WHERE DATENAME(dw,Date) != 'Sunday'
用法:

SELECT dbo.NumberOfDaysExcludingSunday(startDate,endDate)
FROM myTable

没有这样的功能可用-您有
DATEDIFF
-但这只是天数的差异-任何一天,包括周日。如果你必须排除星期天,你将不得不自己做一些额外的工作。但是,我有1000多条记录,如何处理这个…有一个SQL-CLR函数的商业库,我相信它可以处理这些要求(比如“工作日”中两个日期之间的差异)没有这样的功能可用-您有
DATEDIFF
-但这只是天数的差异-任何一天,包括周日。如果你必须排除星期天,你将不得不自己做一些额外的工作。但是,我有1000多条记录,如何处理这个…有一个SQL-CLR函数的商业库,我相信它可以处理这些要求(比如“工作日”中两个日期之间的差异)我会小心使用DATENAME-更改您的语言设置,它将不再工作。我会小心使用DATENAME-更改您的语言设置,它将不再工作。与我对Stewie的评论相同,您需要仔细解释“Sunday”,因为它在某些英语地区以外的系统上不起作用。正如我对Stewie的评论一样,您需要仔细解释“Sunday”,因为它在某些英语地区以外的系统上不起作用。DATEPART(DW,date_值)在大多数情况下都会起作用,但请注意,Sunday不能保证等于1,因为该值(如DATENAME)也会随区域设置而变化。在BOL或MSDN中查找DATEFIRST会话属性()。因此,此解决方案与此处提到的使用DATENAME的其他解决方案存在相同的潜在问题(尽管DayOfWeek的值变化的频率可能小于日期名称的拼写)。DATEPART(DW,date_值)在大多数情况下都会起作用,但请注意,与DATENAME一样,Sunday不能保证等于1,还可以根据区域设置进行更改。在BOL或MSDN中查找DATEFIRST会话属性()。因此,此解决方案与此处提到的使用DATENAME的其他解决方案具有相同的潜在问题(尽管DayOfWeek值的更改频率可能低于日期名称的拼写)。