Internet Explorer 5.5Internet Explorer 7Internet Explorer 6.0IE.NET 1.0.NET 1.1Windows XP.NET 2.0SQL Server 2005IntermediateSQL ServerSQLWindows.NET
选择两个日期之间某天的日期。





3.00/5 (5投票s)
此函数给出两个日期之间某天的日期(例如,从 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)