zoukankan      html  css  js  c++  java
  • Week Function

    程序开发过程中需要做周别统计与显示报表。在做之前,得先找出所在年份周别的开始日期与结束日期。每年每周的开始与结束日期都不尽相同。为了该功能,在sql Server自定义一个用户定义星期函数。
    文件:.wmv;大小:19,535KB;长度:00:26:39。
    下载地址:http://download.cnblogs.com/insus/SQL/SqlFunction_udf_Week.zip

    以下内容于20120105更新:
    2012年刚到,开发的软件使用这个函数发现bug。2012年第一周应该是2012-01-01至2012-01-07,但此函数却把2012-01-08至2012-01-14当作第一周。

    就此bug对此函数修改如下:

    View Code
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[udf_Week]
    (
        @StartYear INT,
        @EndYear INT
    )
    RETURNS @Week TABLE([WeekId] INT IDENTITY(1,1PRIMARY KEY,[Year] [INT] NULL,[Week] [INT] NULL,[StartDate] [DATETIME] NULL,[EndDate] [DATETIME] NULL)
    AS
    BEGIN
        DECLARE @YearStartDate DATETIME 
        DECLARE @YearEndDate DATETIME 
        DECLARE @WeekStartDate DATETIME 
        DECLARE @WeekEndDate DATETIME 
        DECLARE @Weeks INT 

        WHILE @StartYear <= @EndYear
        BEGIN
            SET @YearStartDate = CAST((CAST(@StartYear AS VARCHAR(4)) + '-01-01'AS DATETIME)
            SET @YearEndDate= CAST((CAST(@StartYear AS VARCHAR(4))+ '-12-31'AS DATETIME)
            SET @Weeks = 1         
            
            IF DATEPART(DW,@YearStartDate> 4
                SET @YearStartDate = DATEADD(DAY,(8 - DATEPART(DW,@YearStartDate)) ,@YearStartDate)
            ELSE 
                SET @YearStartDate = DATEADD(DAY,(-(DATEPART(DW,@YearStartDate)-1)),@YearStartDate)

            SET @WeekStartDate = @YearStartDate
            SET @WeekEndDate = DATEADD(DAY,6,@WeekStartDate)
            WHILE DATEDIFF(DAY,@WeekStartDate,@YearEndDate>= 4
            BEGIN
                INSERT INTO @Week([Year],[Week],[StartDate],[EndDate]VALUES (@StartYear,@Weeks,@WeekStartDate,@WeekEndDate)
                SET @Weeks = @Weeks + 1
                SET @WeekStartDate = @WeekStartDate + 7
                SET @WeekEndDate = @WeekEndDate + 7
            END
            SET @StartYear = @StartYear + 1
        END  
            RETURN
    END



     下面内容于2014-12-29 10:45分补充:
    今天程序发现这个函数有bug:

    WHILE DATEDIFF(DAY,@WeekStartDate,@YearEndDate) >= 4
    

     
    2014年最后一周是从2014-12-28至31号,它们有4天时间。因此需要加1天才是正确的:

    WHILE DATEDIFF(DAY,@WeekStartDate,@YearEndDate) + 1 >= 4
    
  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/insus/p/1622988.html
Copyright © 2011-2022 走看看