Tsql SQL Server未显示给定日期的正确周数
SQL Server将显示2011年第一周的第53周(1月1日除外),并且必须是第1周 以下是查询和输出:Tsql SQL Server未显示给定日期的正确周数,tsql,sql-server-2008,date,week-number,Tsql,Sql Server 2008,Date,Week Number,SQL Server将显示2011年第一周的第53周(1月1日除外),并且必须是第1周 以下是查询和输出: declare @T table (dt datetime) insert into @T values ('2010-12-26'), ('2010-12-27'), ('2010-12-28'), ('2010-12-29'), ('2010-12-30'), ('2010-12-31'), ('2011-01-01'), ('2011-01-02'), ('2011-01-03'),
declare @T table (dt datetime)
insert into @T values
('2010-12-26'),
('2010-12-27'),
('2010-12-28'),
('2010-12-29'),
('2010-12-30'),
('2010-12-31'),
('2011-01-01'),
('2011-01-02'),
('2011-01-03'),
('2011-01-04'),
('2011-01-05'),
('2011-01-06'),
('2011-01-07'),
('2011-01-08')
select dt,DATEPART(wk,dt) from @T
输出:
2010-12-26 00:00:00.000 53
2010-12-27 00:00:00.000 53
2010-12-28 00:00:00.000 53
2010-12-29 00:00:00.000 53
2010-12-30 00:00:00.000 53
2010-12-31 00:00:00.000 53
2011-01-01 00:00:00.000 1
2011-01-02 00:00:00.000 2
2011-01-03 00:00:00.000 2
2011-01-04 00:00:00.000 2
2011-01-05 00:00:00.000 2
2011-01-06 00:00:00.000 2
2011-01-07 00:00:00.000 2
2011-01-08 00:00:00.000 2
我希望SQL Server显示12月26日至1月1日的第1周。有人知道如何做到这一点吗
感谢和问候,
Aschwin.我不确定它是否能保持多年,但它看起来像,但你可以用一个声明来解决这个问题
SELECT dt
, CASE WHEN DATEPART(wk, dt) <> 53
THEN DATEPART(wk, dt)
ELSE 1
END
FROM @T
新的datepart不适用于您请求的输出。我不确定它是否适用于所有年份,但它看起来是这样的,但您可以使用语句解决此问题
SELECT dt
, CASE WHEN DATEPART(wk, dt) <> 53
THEN DATEPART(wk, dt)
ELSE 1
END
FROM @T
新的datepart不适用于您请求的输出。这比我最初预期的要困难得多。我正在比较去年年底,看它是否有资格成为新年的一部分。如果是,我将周设置为1,否则我只使用正常周
declare @T table (dt datetime)
insert into @T values
('2010-12-25'),
('2010-12-26'),
('2010-12-27'),
('2010-12-28'),
('2010-12-29'),
('2010-12-30'),
('2010-12-31'),
('2011-01-01'),
('2011-01-02'),
('2011-01-03'),
('2011-01-04'),
('2011-01-05'),
('2011-01-06'),
('2011-01-07'),
('2011-01-08'),
('2011-12-31'),
('2012-01-01')
select dt,
week = case when dt + 6 - datediff(day, -1, dt) % 7 = dateadd(year, datediff(year,-1, dt), 0)
then 1 else datepart(week, dt) end from @t
证明:
这比我最初想象的要困难得多。我正在比较去年年底,看它是否有资格成为新年的一部分。如果是,我将周设置为1,否则我只使用正常周
declare @T table (dt datetime)
insert into @T values
('2010-12-25'),
('2010-12-26'),
('2010-12-27'),
('2010-12-28'),
('2010-12-29'),
('2010-12-30'),
('2010-12-31'),
('2011-01-01'),
('2011-01-02'),
('2011-01-03'),
('2011-01-04'),
('2011-01-05'),
('2011-01-06'),
('2011-01-07'),
('2011-01-08'),
('2011-12-31'),
('2012-01-01')
select dt,
week = case when dt + 6 - datediff(day, -1, dt) % 7 = dateadd(year, datediff(year,-1, dt), 0)
then 1 else datepart(week, dt) end from @t
证明:
我创建了两个函数来处理这个问题 1获取一周的第一天或最后一天 2获取周数或年数 职能1
CREATE FUNCTION [dbo].[fn_GetDayOf]
(
@Date datetime,
--@FirstDayOfWeek int = 7,
@Mode int =1
)
/*
Mode 1: First Day Of Week
Mode 2: Last Day Of Week
*/
RETURNS datetime
WITH EXECUTE AS CALLER
BEGIN
Declare @Return datetime
--SET DATEFIRST @FirstDayOfWeek
IF @Mode = 1
BEGIN
select @Return = dateadd(day,-(datepart(weekday,@date)-1),convert(date,@date))
END
ELSE IF @Mode = 2
BEGIN
select @Return = dateadd(SECOND,-1,convert(datetime,dateadd(day,(datepart(weekday,@date)),convert(date,@date))))
END
ELSE
BEGIN
SET @Return = @Date
END
--SET DATEFIRST 7
RETURN @Return
END
职能2
CREATE FUNCTION [dbo].[fn_GetYearWeek]
(
@Date datetime,
--@FirstDayOfWeek int = 7,
@Mode int =1
)
/*
Mode 1 = Week Number
Mode 2 = Year
*/
RETURNS INT
BEGIN
declare @Return int
IF @Mode = 1
BEGIN
select @Return = case when datepart(week,[dbo].[fn_GetDayOf] (@Date,1)) <> datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) then datepart(week,[dbo].[fn_GetDayOf] (@Date,1)) else datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) end
END
ELSE IF @Mode = 2
BEGIN
select @Return = case when datepart(WEEK,[dbo].[fn_GetDayOf] (@Date,1)) <> datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) then datepart(YEAR,[dbo].[fn_GetDayOf] (@Date,1)) else datepart(YEAR,[dbo].[fn_GetDayOf] (@Date,2)) end
END
ELSE
BEGIN
SET @Return = -1
END
Return @Return
END
运行示例
declare @T table (dt datetime)
insert into @T values
('2010-12-25'),
('2010-12-26'),
('2010-12-27'),
('2010-12-28'),
('2010-12-29'),
('2010-12-30'),
('2010-12-31'),
('2011-01-01'),
('2011-01-02'),
('2011-01-03'),
('2011-01-04'),
('2011-01-05'),
('2011-01-06'),
('2011-01-07'),
('2011-01-08'),
('2011-12-31'),
('2012-01-01'),
('2012-01-02'),
('2012-12-31'),
('2013-01-01')
select
dt,
datepart(week,dt),
--case when datepart(week,[dbo].[fn_GetDayOf] (dt,1)) <> datepart(week,[dbo].[fn_GetDayOf] (dt,2)) then datepart(week,[dbo].[fn_GetDayOf] (dt,1)) else datepart(week,[dbo].[fn_GetDayOf] (dt,2)) end
[dbo].[fn_GetYearWeek] (dt,1),
[dbo].[fn_GetYearWeek] (dt,2)
from @T
结果:我创建了两个函数来处理此问题 1获取一周的第一天或最后一天 2获取周数或年数 职能1
CREATE FUNCTION [dbo].[fn_GetDayOf]
(
@Date datetime,
--@FirstDayOfWeek int = 7,
@Mode int =1
)
/*
Mode 1: First Day Of Week
Mode 2: Last Day Of Week
*/
RETURNS datetime
WITH EXECUTE AS CALLER
BEGIN
Declare @Return datetime
--SET DATEFIRST @FirstDayOfWeek
IF @Mode = 1
BEGIN
select @Return = dateadd(day,-(datepart(weekday,@date)-1),convert(date,@date))
END
ELSE IF @Mode = 2
BEGIN
select @Return = dateadd(SECOND,-1,convert(datetime,dateadd(day,(datepart(weekday,@date)),convert(date,@date))))
END
ELSE
BEGIN
SET @Return = @Date
END
--SET DATEFIRST 7
RETURN @Return
END
职能2
CREATE FUNCTION [dbo].[fn_GetYearWeek]
(
@Date datetime,
--@FirstDayOfWeek int = 7,
@Mode int =1
)
/*
Mode 1 = Week Number
Mode 2 = Year
*/
RETURNS INT
BEGIN
declare @Return int
IF @Mode = 1
BEGIN
select @Return = case when datepart(week,[dbo].[fn_GetDayOf] (@Date,1)) <> datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) then datepart(week,[dbo].[fn_GetDayOf] (@Date,1)) else datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) end
END
ELSE IF @Mode = 2
BEGIN
select @Return = case when datepart(WEEK,[dbo].[fn_GetDayOf] (@Date,1)) <> datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) then datepart(YEAR,[dbo].[fn_GetDayOf] (@Date,1)) else datepart(YEAR,[dbo].[fn_GetDayOf] (@Date,2)) end
END
ELSE
BEGIN
SET @Return = -1
END
Return @Return
END
运行示例
declare @T table (dt datetime)
insert into @T values
('2010-12-25'),
('2010-12-26'),
('2010-12-27'),
('2010-12-28'),
('2010-12-29'),
('2010-12-30'),
('2010-12-31'),
('2011-01-01'),
('2011-01-02'),
('2011-01-03'),
('2011-01-04'),
('2011-01-05'),
('2011-01-06'),
('2011-01-07'),
('2011-01-08'),
('2011-12-31'),
('2012-01-01'),
('2012-01-02'),
('2012-12-31'),
('2013-01-01')
select
dt,
datepart(week,dt),
--case when datepart(week,[dbo].[fn_GetDayOf] (dt,1)) <> datepart(week,[dbo].[fn_GetDayOf] (dt,2)) then datepart(week,[dbo].[fn_GetDayOf] (dt,1)) else datepart(week,[dbo].[fn_GetDayOf] (dt,2)) end
[dbo].[fn_GetYearWeek] (dt,1),
[dbo].[fn_GetYearWeek] (dt,2)
from @T
结果:检索当前年度总周数的另一种方法:
DECLARE @LASTDAY DATETIME
DECLARE @weeks INT
SET @LASTDAY = DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0)))
SELECT @weeks = CASE DATEname(dw,@LASTDAY)
WHEN 'MONDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5))
WHEN 'TUESDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5))
WHEN 'WEDNESDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5))
ELSE DATEPART(WK, @LASTDAY)
END
select @weeks
检索当前年度总周数的另一种方法:
DECLARE @LASTDAY DATETIME
DECLARE @weeks INT
SET @LASTDAY = DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0)))
SELECT @weeks = CASE DATEname(dw,@LASTDAY)
WHEN 'MONDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5))
WHEN 'TUESDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5))
WHEN 'WEDNESDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5))
ELSE DATEPART(WK, @LASTDAY)
END
select @weeks