判断给定时间段所在的星期一和星期天的日期

数据库 SQL Server
最近报表要用到一项功能,需要把数据源根据记录发生日期所在的星期序列进行分组。因此就写了两个相关SQL Function进行调用。

最近报表要用到一项功能,需要把数据源根据记录发生日期所在的星期序列进行分组。因此就写了两个相关SQL Function进行调用。

一、给定一个日期值,求出此日期所在星期的星期一和星期天的日期数据

例如给定一个日期 2010-09-01,求出它所在星期的星期一是2010-08-30,星期天是2010-09-05

 Function创建如下:

  1. USE [MSSQL] 
  2. GO 
  3. SET ANSI_NULLS ON 
  4. GO 
  5. SET QUOTED_IDENTIFIER ON 
  6. GO 
  7. CREATE FUNCTION [dbo].[My_OneDay_GetWeekFirstAndEndDay](@tmpDate DATETIME) 
  8. RETURNS  @tmpTable TABLE(FirstDay DATETIME , EndDay DATETIME) 
  9. AS 
  10. BEGIN 
  11.     INSERT INTO @tmpTable 
  12.     SELECT a.FirstDay,b.EndDay FROM (     
  13.         SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 0) AS FirstDAy 
  14.     ) a 
  15.     LEFT JOIN ( 
  16.         SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 6) AS EndDay 
  17.     ) b 
  18.     ON a.ID = b.ID 
  19.     RETURN 
  20. END 

Function测试:

  1. SELECT * from  My_OneDay_GetWeekFirstAndEndDay('2010-09-01'

二、以上面单个日期搜索为基础,由用户输入两个参数,一个是开始日期,一个结束日期,根据这两个参数,求出在此时期段内的所有星期的星期一和星期天的日期表并排序。

例如开始日期是2011-09-01,结束日期是2011-10-06,我们就可以得到此星期表如下:

  1. WeekOrder              FirstDay                                EndDay 
  2.  1               2011-08-29 00:00:00.000  2011-09-04 00:00:00.000 
  3.  2               2011-09-05 00:00:00.000  2011-09-11 00:00:00.000 
  4.  3               2011-09-12 00:00:00.000  2011-09-18 00:00:00.000 
  5.  4               2011-09-19 00:00:00.000  2011-09-25 00:00:00.000 
  6.  5               2011-09-26 00:00:00.000  2011-10-02 00:00:00.000 
  7.  6               2011-10-03 00:00:00.000  2011-10-09 00:00:00.000 

Function创建如下:

  1. USE [MSSQL] 
  2. GO 
  3. SET ANSI_NULLS ON 
  4. GO 
  5. SET QUOTED_IDENTIFIER ON 
  6. GO 
  7. CREATE FUNCTION [dbo].[MY_Range_GetWeekFirstAndEndDays](@tmpDateSTART DATETIME,@tmpDateEND DATETIME) 
  8. RETURNS  @tmpTable TABLE(WeekOrder INT,FirstDay DATETIME , EndDay DATETIME) 
  9. AS 
  10. BEGIN    
  11.  DECLARE   @tmpDate   DATETIME 
  12.  DECLARE   @index         INT 
  13.  SET       @tmpDate=@tmpDateSTART 
  14.  SET       @index=1 
  15.      WHILE     @tmpDate <=@tmpDateEND 
  16.         BEGIN  
  17.              INSERT INTO @tmpTable 
  18.                 SELECT @index,a.FirstDay,b.EndDay FROM (     
  19.                     SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 0) AS FirstDAy) a 
  20.                 LEFT JOIN ( 
  21.                     SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 6) AS EndDay) b 
  22.                 ON a.ID = b.ID 
  23.  
  24.           SET   @tmpDate=DATEADD(DAY,7,@tmpDate) 
  25.           SET   @index=@index+1 
  26.          END  
  27.      RETURN 
  28. END 

Function测试:

  1. SELECT * from  My_Range_GetWeekFirstAndEndDays('2011-09-01','2011-10-06'

原文链接:http://www.cnblogs.com/wsdj-ITtech/archive/2011/10/06/2199736.html

【编辑推荐】

  1. 常见数据库的分页实现方案
  2. Oracle分页小谈
  3. 谈谈Java调用SQL Server分页存储过程
  4. 浅述asp.net海量分页数据存储过程
  5. 证明DataReader分页的可行性
责任编辑:艾婧 来源: 万事大吉的博客
相关推荐

2009-11-17 11:39:57

PHP日期格式

2011-12-07 16:50:52

移动购物移动电商

2011-05-05 13:28:08

PHP

2011-12-20 20:50:42

移动应用

2010-07-19 16:52:23

SQL Server

2010-09-24 19:23:51

SQL查询时间段

2010-04-27 16:53:53

Windows 7日期栏

2010-09-25 16:32:02

SQL语句

2010-06-28 10:28:02

SQL Server日

2010-11-25 10:21:20

MySql查询时间段

2010-09-09 10:42:30

SQL函数时间

2010-10-13 16:49:56

MySql查询时间段

2010-11-22 11:25:07

MySQL查询时间段

2022-03-15 13:22:19

Python日期命令

2015-07-27 15:15:10

2014-05-31 15:40:46

2022-10-10 12:53:33

Python模块

2009-11-17 10:28:43

PHP星期几获取

2021-12-01 12:02:41

礼品卡骗局黑色星期五加密货币

2010-09-09 16:20:09

SQL循环更新
点赞
收藏

51CTO技术栈公众号