帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:Select  日期  dates  


介绍

在开发每周状态functinalities的应用程序时,需要在两天之间列出特定日期的日期。 因此,列出partiuclar日的日期在这种situtation中非常有用。fnGetDatesforAday函数为两个日期之间的一天提供日期。

背景

我需要列出两个日期之间的所有星期日,这样我就可以编写相同的代码。 后来我把代码转换为通用的,结果是这个函数。

这里函数 recieves 3 参数 DateFrom,DateTo和 DayName。

  • DateFrom:我们想要一天的日期的日期。 它接受两种格式的日期"MM/DD/YYY" 和"mm-dd-yyyy"。
  • DateTo:日期,我们要一天的日期。 它接受两种格式的日期"MM/DD/YYY" 和"mm-dd-yyyy"。
  • DayName:我们需要列出日期的日名称。 有效值为"星期日","星期一","星期二","周三","星期四","星期五"和"星期六"。

这里函数使用两个系统函数

  • DATEDIFF
  • DATENAME

这里的逻辑首先找出两个日期之间的天数,使用of函数返回天数。 所以使用这个数字我们可以循环每天,在开始日期到结束日期之间检查所需的日期。

为了获得日名,我们使用DATENAME函数,如"星期日"。"星期一"。"星期二"。"周三"。"星期四"。"星期五"和"星期六",如果发现日期。 最后表包含表格中所有需要的日期日期。 最后返回表格中插入的所有日期。

使用代码

在select语句或者存储过程中,你可以在需要特定日期的日期列表中使用这里代码。


SET ANSI_NULLS ON


GO


SET QUOTED_IDENTIFIER ON


GO


-- =============================================


-- Author: Shivshanker cheral


-- Create date: <date month="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)





我们可以根据需要使用转换函数和 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)




对于错误,它将结果作为日期列中的无效日期,在日期列中为空


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)





文章标签:Select  日期  dates  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语