信息:MS SQL Server 2008 R2
您好。我正在尝试创建一个具有两个参数输入和一个输出的函数。这两个输入是一周中的一天,因为INT(@dowin)从星期一开始为1,而DATETIME(@datein)。该函数的目的是通过查看从(@datein)创建的周范围并使用星期几INT(@dowin)从该范围中选择新的DATETIME来确定新的DATETIME输出(@newdate)。 / p>
原因:约会计划程序正在使用开始日期,如果约会正在重新启动,则会创建从开始日期开始重新出现的一周中的某一天。我正在从表视图创建一个SSRS报告,我需要每个约会发生的实例。
这是我到目前为止的函数脚本:
CREATE FUNCTION UFsurgopsched(@datein DATETIME,@dowin int)
RETURNS datetime
AS
BEGIN
DECLARE @newdate datetime
DECLARE @startOfWeek date
DECLARE @endOfWeek date
SELECT @newdate = datepart(dw,@dowin) as date in
(
SELECT
convert(date, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)) AS @startOfWeek,
convert(date, dateadd(dd, 7-(datepart(dw, @datein)-1), @datein)) AS @endOfWeek
)
RETURN @newdate
END
我想要的是: - @dowin = 3 - @datein = 2014-02-11 07:30:00.000 - @datein应该找到范围:2014-02-10到2014-02-16 在该范围内,根据@dowin的@newdate将是2014-02-12 07:30:00.000
的 的 ** 修改的 * ** 在每个人的帮助之后,我能够以更简单的功能解决问题:
CREATE FUNCTION [dbo].[UFsurgopsched](@datein DATETIME,@dowin int)
RETURNS DATETIME
AS
BEGIN
DECLARE @newdate DATETIME
DECLARE @dateweek DATETIME
SET
@dateweek =
convert(datetime, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein))
SELECT
@newdate =
dateadd(DD ,@dowin - 1, @dateweek)
RETURN
@newdate
END
答案 0 :(得分:0)
我不完全确定我理解您的标准,但这会根据您的示例返回所需的结果:
DECLARE @newdate datetime
DECLARE @startOfWeek datetime
DECLARE @endOfWeek datetime
declare @datein DATETIME
declare @dowin int
set @dowin = 3
set @datein = '2014-02-11 07:30:00.000'
/* -- Don't think you need any of this
SELECT @newdate = datepart(dw,@dowin) as date in
(
SELECT
convert(date, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)) AS @startOfWeek,
convert(date, dateadd(dd, 7-(datepart(dw, @datein)-1), @datein)) AS @endOfWeek
)
*/
select
dateadd(dd,@dowin, convert(datetime, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)))
我只是使用你的逻辑计算你的“星期开始”(只是将它设为日期时间),并将@dowin parm添加到它。
答案 1 :(得分:0)
试试这个;
CREATE FUNCTION UFsurgopsched(@datein DATETIME,@dowin int)
RETURNS datetime
as begin
declare @dowinf int
DECLARE @newdate datetime
if (@dowin)= 7 begin set @dowinf =1 end else set @dowinf =@dowin+1
DECLARE @startOfWeek int = Datepart(DW,@datein)
if @startOfWeek<@dowinf set @newdate = dateadd(day,@dowinf-@startOfWeek,@datein) else if @startOfWeek>@dowinf set @newdate = dateadd(day,7-(@startOfWeek-@dowinf),@datein) else set @newdate = dateadd(day,7,@datein)
return @newdate
end
--------------Will return the next date from @datein where week day number @dowin matches
---------------For Example if insert 20140213 and weekday as 1
---------------will return the date of next Monday from the entered date
希望这会有效