Sql server 需要函数给出一周中第一天的日期时间,给出一周中第一天的天数
对许多人来说,工作周的第一天是星期一,但让我们说它是不同的一天,比如说星期三 您是否可以帮助我创建一个函数(SQL Server 2012),该函数返回中第一天的日期:Sql server 需要函数给出一周中第一天的日期时间,给出一周中第一天的天数,sql-server,Sql Server,对许多人来说,工作周的第一天是星期一,但让我们说它是不同的一天,比如说星期三 您是否可以帮助我创建一个函数(SQL Server 2012),该函数返回中第一天的日期: 本周 下周 上周 我们给出了一个日期,类型(Current,Next,Last),FirstDay(0,1,2,3,4,5,6),并根据类型返回当前的第一天或一周的下一天或最后一天的datetime 创建函数[dbo]。[GetStartofWeek] ( @第一天, @VARCHAR型(10), @日期时间 ) 返回日期 作为
@第一天, @VARCHAR型(10), @日期时间 ) 返回日期 作为 开始
谢谢我相信这会告诉你你想要的日期:
create function [dbo].[GetStartofWeek]
(
@firstDay int,
@type varchar(10),
@day date
)
returns date as
begin
-- use datediff/dateadd to get the date of sunday for the week of the given @day (-1 casts as Sunday 1899-12-31)
declare @sundayOfWeek date = dateadd(week, datediff(week, -1, @day), -1)
-- @firstDay is 0 to 6, 0 representing Sunday
declare @firstDayOfWeek date = dateadd(day, @firstDay, @sundayOfWeek)
-- add or subtract a week if necessary
set @type = upper(@type)
if @type = 'LAST'
set @firstDayOfWeek = dateadd(week, -1, @firstDayOfWeek)
else if @type = 'NEXT'
set @firstDayOfWeek = dateadd(week, 1, @firstDayOfWeek)
return @firstDayOfWeek
end
go
使用以下输入进行测试:
select [dbo].[GetStartofWeek](0, 'Last', '2014-12-14') -- 2014-12-07
select [dbo].[GetStartofWeek](3, 'Last', '2014-12-14') -- 2014-12-10
select [dbo].[GetStartofWeek](6, 'Last', '2014-12-14') -- 2014-12-13
select [dbo].[GetStartofWeek](0, 'Current', '2014-12-17') -- 2014-12-14
select [dbo].[GetStartofWeek](3, 'Current', '2014-12-17') -- 2014-12-17
select [dbo].[GetStartofWeek](6, 'Current', '2014-12-17') -- 2014-12-20
select [dbo].[GetStartofWeek](0, 'Next', '2014-12-20') -- 2014-12-21
select [dbo].[GetStartofWeek](3, 'Next', '2014-12-20') -- 2014-12-24
select [dbo].[GetStartofWeek](6, 'Next', '2014-12-20') -- 2014-12-27
一个建议是使用一周补偿,而不是“上一周”/“当前期”/“下一周”,这更干净、更灵活:
alter function [dbo].[GetStartofWeek]
(
@firstDay int,
@weekOffset int,
@day date
)
returns date as
begin
-- use datediff/dateadd to get the date of sunday for the week of the given @day (-1 casts as Sunday 1899-12-31)
declare @sundayOfWeek date = dateadd(week, datediff(week, -1, @day), -1)
-- @firstDay is 0 to 6, 0 representing Sunday
declare @firstDayOfWeek date = dateadd(day, @firstDay, @sundayOfWeek)
-- add or subtract weeks if necessary
if @weekOffset <> 0
begin
set @firstDayOfWeek = dateadd(week, @weekOffset, @firstDayOfWeek)
end
return @firstDayOfWeek
end
go
alter函数[dbo].[GetStartofWeek]
(
@第一天,
@weekOffset int,
@日期
)
返回日期为
开始
--使用datediff/dateadd获取给定@天的一周的星期日日期(-1铸造为星期日1899-12-31)
声明@sundayOfWeek date=dateadd(周,日期差(周,-1,@day),-1)
--@第一天是0到6,0代表星期天
声明@firstDayOfWeek日期=dateadd(天、@firstDay、@sundayOfWeek)
--如有必要,增加或减少周数
如果@weekOffset 0
开始
设置@firstDayOfWeek=dateadd(周、@weekOffset、@firstDayOfWeek)
结束
返回@firstDayOfWeek
结束
去
你能告诉我们到目前为止你都做了些什么吗?1900日期系统的行为是,MOD(,7)
等于周日为零的工作日。如果您希望星期三为零,请将4添加到MOD
直到SQL 2014年才推出,但可以通过SELECT CONVERT(int,getdate())-7*(CONVERT(int,getdate())/7)轻松模仿。你剩下的问题就是加减法。