65.9K
CodeProject 正在变化。 阅读更多。
Home

选择两个日期之间某天的日期。

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (5投票s)

2008年7月21日

CPOL

2分钟阅读

viewsIcon

39828

此函数给出两个日期之间某天的日期(例如,从 08 年 1 月到 08 年 8 月的所有星期日)

引言

当我们在开发具有每周状态功能的应用程序时,需要列出两个日期之间的特定日期的日期。因此,列出特定日期的日期在这种情况下非常有用。fnGetDatesforAday函数给出两个日期之间某天的日期。

背景

有一次我需要列出两个日期之间的所有星期日,所以我编写了相同的代码。 后来,我将该代码转换为通用代码,适用于所有日期,结果就是这个函数。

此函数接收三个参数 DateFrom、DateTo 和 DayName。

  • DateFrom:我们想要从中获取某天日期的日期。 它接受“MM/DD/YYY”和“MM-DD-YYYY”两种格式的日期。
  • DateTo:我们想要获取某天日期的截止日期。 它接受“MM/DD/YYY”和“MM-DD-YYYY”两种格式的日期。
  • DayName:我们需要列出日期的日期名称。 有效值为“Sunday”、“Monday”、“Tuesday”、“Wednesday”、“Thursday”、“Friday”和“Saturday”。

此函数使用两个系统函数

  • DATEDIFF
  • DATENAME

这里的逻辑是首先使用 DATEDIFF 函数找出两个日期之间的天数,该函数返回天数。 因此,使用此数字,我们可以循环遍历每一天,并检查开始日期到结束日期之间的日期是否为所需日期。

要获取日期名称,我们使用 DATENAME 函数,该函数为我们提供日期名称,如“Sunday”、“Monday”、“Tuesday”、“Wednesday”、“Thursday”、“Friday”和“Saturday”,因此将给定日期与这些日期进行比较。如果找到,则将日期插入到表中。 因此,最终,该表包含表中所有需要的日期的日期。 最后,返回插入到表中的所有日期。

使用代码

您可以在 select 语句或存储过程中使用此代码,在其中您需要特定日期的日期列表。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Shivshanker cheral
-- Create date: "7" day="18" year="2008" />18 July 2008
-- Description:   To Get any weekday dates between two dates 
-- =============================================

CREATE FUNCTION fnGetDatesforAday
(
      -- Add the parameters for the function here
      @DtFrom DATETIME,
      @DtTo DATETIME,
      @DayName VARCHAR(12)
)

RETURNS @DateList TABLE ([Day] varchar(20),Dt datetime)

AS
BEGIN
      IF NOT (@DayName = 'Monday' OR @DayName = 'Sunday' OR @DayName = 'Tuesday' OR @DayName = 'Wednesday' OR @DayName = 'Thursday' OR @DayName = 'Friday' OR @DayName = 'Saturday')
      BEGIN
            --Error Insert the error message and return

            INSERT INTO @DateList
            SELECT 'Invalid Day',NULL AS DAT
            RETURN
      END 

      DECLARE @TotDays INT
      DECLARE @CNT INT

      SET @TotDays =  DATEDIFF(DD,@DTFROM,@DTTO)-- [NO OF DAYS between two dates]

      SET @CNT = 0
      WHILE @TotDays >= @CNT        -- repeat for all days 
      BEGIN
        -- Pick each single day and check for the day needed
            IF DATENAME(DW, (@DTTO - @CNT)) = @DAYNAME
            BEGIN
                  INSERT INTO @DateList
                 SELECT @DAYNAME,(@DTTO - @CNT) AS DAT
            END
            SET @CNT = @CNT + 1
      END
      RETURN
END

GO 
      

Output:
 SELECT [Day],[Dt] FROM dbo.fnGetDatesforAday('7/1/2008','8/31/2008','Sunday')
 Day Dt
 -------------------- -----------------------
 Sunday 2008-08-31 00:00:00.000
 Sunday 2008-08-24 00:00:00.000
 Sunday 2008-08-17 00:00:00.000
 Sunday 2008-08-10 00:00:00.000
 Sunday 2008-08-03 00:00:00.000
 Sunday 2008-07-27 00:00:00.000
 Sunday 2008-07-20 00:00:00.000
 Sunday 2008-07-13 00:00:00.000
 Sunday 2008-07-06 00:00:00.000 
(9 row(s) affected)



我们可以使用 convert 函数和 Order by 子句,按排序顺序以不同的日期格式列出日期,以满足我们的需要。

SELECT [Day],CONVERT(VARCHAR,[Dt],105) AS [Date] FROM dbo.fnGetDatesforAday('7/1/2008','8/31/2008','Sunday') ORDER BY [Dt]

Day                  Date
-------------------- ------------------------------
Sunday               06-07-2008
Sunday               13-07-2008
Sunday               20-07-2008
Sunday               27-07-2008
Sunday               03-08-2008
Sunday               10-08-2008
Sunday               17-08-2008
Sunday               24-08-2008
Sunday               31-08-2008

(9 row(s) affected)


对于错误,它在“Day”列中给出“Invalid Day”的结果,在“Date”列中给出“Null”的结果

SELECT [Day],CONVERT(VARCHAR,[Dt],105) AS [Date] FROM dbo.fnGetDatesforAday('7/1/2008','8/31/2008','Sumday') ORDER BY [Dt]

Day                  Date
-------------------- ------------------------------
Invalid Day          NULL

(1 row(s) affected)
© . All rights reserved.