SQL Server中返回空值的日期函数 创建函数[dbo]。[NewFinishDate] (@HourlyQ decimal(18,2),@TotalQ decimal(18,2), @星期一整数、@星期二整数、@星期三整数、, @星期四整数、@星期五整数、@星期六整数、@星期日整数) 返回日期 作为 开始 声明@DayName nvarchar(10),@DayHour整数, @计算小数(18,2),@日期为日期, @i整数、@Finishdate日期、@Addeddate日期 挑选 @日期=日期添加(日期,-1,[开始日期]) 从…起 [工程量与规划] 而@Calculation
此代码返回空值。我有一个SQL Server中返回空值的日期函数 创建函数[dbo]。[NewFinishDate] (@HourlyQ decimal(18,2),@TotalQ decimal(18,2), @星期一整数、@星期二整数、@星期三整数、, @星期四整数、@星期五整数、@星期六整数、@星期日整数) 返回日期 作为 开始 声明@DayName nvarchar(10),@DayHour整数, @计算小数(18,2),@日期为日期, @i整数、@Finishdate日期、@Addeddate日期 挑选 @日期=日期添加(日期,-1,[开始日期]) 从…起 [工程量与规划] 而@Calculation,sql,sql-server,database,function,date,Sql,Sql Server,Database,Function,Date,此代码返回空值。我有一个[Quantilities&Planning]表和[StartingDate]列,其中包括日期类型变量。我还尝试返回另一个变量,如nvarchar和integer。问题可能在while循环中 您是否意识到以下声明: Create FUNCTION [dbo].[NewFinishDate] (@HourlyQ decimal(18,2), @TotalQ decimal(18,2), @Monday integer, @Tuesday integer,
[Quantilities&Planning]
表和[StartingDate]
列,其中包括日期类型变量。我还尝试返回另一个变量,如nvarchar
和integer
。问题可能在while循环中 您是否意识到以下声明:
Create FUNCTION [dbo].[NewFinishDate]
(@HourlyQ decimal(18,2), @TotalQ decimal(18,2),
@Monday integer, @Tuesday integer, @Wednesday integer,
@Thursday integer, @Friday integer, @Saturday integer, @Sunday integer)
RETURNS date
AS
BEGIN
DECLARE @DayName nvarchar(10), @DayHour integer,
@Calculation Decimal(18,2), @Date as date,
@i integer, @Finishdate date, @Addeddate date
SELECT
@Date = DATEADD(DAY, -1, [Starting date])
FROM
[Quantities&Planning]
WHILE @Calculation < @TotalQ
BEGIN
SELECT @i += 1
SELECT @Addeddate = DATEADD(DAY, @i, @date)
SELECT @DayName = DATENAME(WEEKDAY, @Addeddate)
IF @DayName ='Monday'
BEGIN
set @DayHour = @Monday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Tuesday'
begin
set @DayHour = @Tuesday
set @Calculation += @HourlyQ*@DayHour
end
if @DayName ='Wednesday'
begin
set @DayHour = @Wednesday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Thursday'
begin
set @DayHour = @Thursday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Friday'
begin
set @DayHour = @Friday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Saturday'
begin
set @DayHour = @Saturday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Sunday'
begin
set @DayHour = @Sunday
set @Calculation += @HourlyQ*@DayHour
end
end
SELECT
@Finishdate = DATEADD(DAY, @i, [Starting date])
FROM
[Quantities&Planning]
RETURN @Finishdate
END
SELECT
[dbo].[NewFinishDate](2,5000,2,2,2,2,2,2,2) as Yekeee
FROM
[Quantities&Planning]
将从整个表返回的最后一个[开始日期]
(减去1天)分配给@date
?最后一行是任意的,因为select语句中没有ORDER BY子句
分配给@Finishdate
的操作也一样。。。您可能希望从特定行分配,是吗?然后添加一个适当的WHERE
子句,该子句仅选择该特定行
第二个问题是,您从未初始化
@i
变量,因此在您运行时它是NULL
:
SELECT
@Date = DATEADD(DAY, -1, [Starting date])
FROM
[Quantities&Planning]
@i
将在整个过程中保持NULL
(对NULL
的操作产生NULL
)
您一直使用这个NULL
值来添加日期,这也会导致NULL
值
与
@计算相同的问题
。。。您需要在使用变量之前初始化它们!并不是因为您声明了一个变量,它们会自动初始化为0(整数和小数)。除非您以不同方式初始化它们,否则它们将初始化为NULL
。您是否意识到以下语句:
Create FUNCTION [dbo].[NewFinishDate]
(@HourlyQ decimal(18,2), @TotalQ decimal(18,2),
@Monday integer, @Tuesday integer, @Wednesday integer,
@Thursday integer, @Friday integer, @Saturday integer, @Sunday integer)
RETURNS date
AS
BEGIN
DECLARE @DayName nvarchar(10), @DayHour integer,
@Calculation Decimal(18,2), @Date as date,
@i integer, @Finishdate date, @Addeddate date
SELECT
@Date = DATEADD(DAY, -1, [Starting date])
FROM
[Quantities&Planning]
WHILE @Calculation < @TotalQ
BEGIN
SELECT @i += 1
SELECT @Addeddate = DATEADD(DAY, @i, @date)
SELECT @DayName = DATENAME(WEEKDAY, @Addeddate)
IF @DayName ='Monday'
BEGIN
set @DayHour = @Monday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Tuesday'
begin
set @DayHour = @Tuesday
set @Calculation += @HourlyQ*@DayHour
end
if @DayName ='Wednesday'
begin
set @DayHour = @Wednesday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Thursday'
begin
set @DayHour = @Thursday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Friday'
begin
set @DayHour = @Friday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Saturday'
begin
set @DayHour = @Saturday
set @Calculation += @HourlyQ*@DayHour
end
else if @DayName ='Sunday'
begin
set @DayHour = @Sunday
set @Calculation += @HourlyQ*@DayHour
end
end
SELECT
@Finishdate = DATEADD(DAY, @i, [Starting date])
FROM
[Quantities&Planning]
RETURN @Finishdate
END
SELECT
[dbo].[NewFinishDate](2,5000,2,2,2,2,2,2,2) as Yekeee
FROM
[Quantities&Planning]
将从整个表返回的最后一个[开始日期]
(减去1天)分配给@date
?最后一行是任意的,因为select语句中没有ORDER BY子句
分配给@Finishdate
的操作也一样。。。您可能希望从特定行分配,是吗?然后添加一个适当的WHERE
子句,该子句仅选择该特定行
第二个问题是,您从未初始化
@i
变量,因此在您运行时它是NULL
:
SELECT
@Date = DATEADD(DAY, -1, [Starting date])
FROM
[Quantities&Planning]
@i
将在整个过程中保持NULL
(对NULL
的操作产生NULL
)
您一直使用这个NULL
值来添加日期,这也会导致NULL
值
与
@计算相同的问题
。。。您需要在使用变量之前初始化它们!并不是因为您声明了一个变量,它们会自动初始化为0(整数和小数)。除非您以不同的方式初始化它们,否则它们将初始化为NULL
。对于所有分配,最好使用“设置”而不是“选择”。select可以使用空值执行奇怪的操作。从表中拾取值时,我不能使用set。我也试过set,但还是一样。我不禁想知道是否应该删除您查询中[Quantilities&Planning]中出现的。我看不到您实际使用了[数量与计划]
中的任何值。对于所有作业,最好使用“设置”而不是“选择”。select可以使用空值执行奇怪的操作。从表中拾取值时,我不能使用set。我也试过set,但还是一样。我不禁想知道是否应该删除您查询中[Quantilities&Planning]
中出现的。我看不到您实际使用了[Quantilities&Planning]
中的任何值。声明@Calculation Decimal(18,2)=0,@I integer=0这更正了我的功能。谢谢你的回答。声明@Calculation Decimal(18,2)=0,@i integer=0这更正了我的功能。谢谢你的回答。