在sql Server自定義一個用戶定義星期函數(shù)
更新時間:2012年01月28日 22:39:43 作者:
程序開發(fā)過程中需要做周別統(tǒng)計與顯示報表。在做之前,得先找出所在年份周別的開始日期與結(jié)束日期。每年每周的開始與結(jié)束日期都不盡相同。為了該功能,在sql Server自定義一個用戶定義星期函數(shù)
文件:.wmv;大?。?9,535KB;長度:00:26:39。
下載地址:SqlFunction_udf_Week.rar
以下內(nèi)容于20120105更新:
2012年剛到,開發(fā)的軟件使用這個函數(shù)發(fā)現(xiàn)bug。2012年第一周應(yīng)該是2012-01-01至2012-01-07,但此函數(shù)卻把2012-01-08至2012-01-14當(dāng)作第一周。
就此bug對此函數(shù)修改如下:
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,1) PRIMARY 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
下載地址:SqlFunction_udf_Week.rar
以下內(nèi)容于20120105更新:
2012年剛到,開發(fā)的軟件使用這個函數(shù)發(fā)現(xiàn)bug。2012年第一周應(yīng)該是2012-01-01至2012-01-07,但此函數(shù)卻把2012-01-08至2012-01-14當(dāng)作第一周。
就此bug對此函數(shù)修改如下:
復(fù)制代碼 代碼如下:
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,1) PRIMARY 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
相關(guān)文章
Microsoft SQLServer的版本區(qū)別及選擇
Microsoft SQLServer的版本區(qū)別及選擇...2007-02-02ASP和SQL Server如何構(gòu)建網(wǎng)頁防火墻
本文介紹的是利用ASP和SQL Server構(gòu)建網(wǎng)頁防火墻,介紹建立的過程,主要分三步給大家介紹的。希望對你有幫助,一起來看。2015-10-10ODBC連接數(shù)據(jù)庫以SQLserver為例圖文詳解
開放數(shù)據(jù)庫互連(ODBC)是微軟提出的數(shù)據(jù)庫訪問接口標(biāo)準(zhǔn),開放數(shù)據(jù)庫互連定義了訪問數(shù)據(jù)庫的API一個規(guī)范,這些API獨立于不同廠商的DBMS,也獨立于具體的編程語言,下面這篇文章主要給大家介紹了關(guān)于ODBC連接數(shù)據(jù)庫以SQLserver為例的相關(guān)資料,需要的朋友可以參考下2023-05-05SQL Server創(chuàng)建數(shù)據(jù)庫圖文教程
這篇文章主要介紹了SQL Server創(chuàng)建數(shù)據(jù)庫圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02sql server Bulk Insert命令詳細(xì)
這篇文章主要介紹了sql server Bulk Insert命令詳細(xì) ,需要的朋友可以參考下2015-08-08bak文件怎么打開 2000w數(shù)據(jù)怎么打開?
這篇文章主要介紹了sqlserver數(shù)據(jù)庫bak文件如何恢復(fù)打開的方法,需要的朋友可以參考下2014-02-02