-1

我在下面的代码之前可以正常工作,可以显示为年、月和日。所以下面的代码我总结为仅显示为天,我进行了一些转换。我在我的代码中遇到了一些小问题。我的年份显示 330 而不是 365。如果我输入 1 年,它应该显示 365,1 个月应该是 30..但是如果 34 天它应该显示为 34,而不是显示为 60 天。任何人都可以弄清楚它是怎么来的我在下面的代码中收到此错误。这是我在 ssrs 2008 报告属性中的代码

Public Function ILength(length  As Integer ) As String

           dim year As Integer=0
           dim month As Integer=0
           dim day  As Integer=0
           dim sum  as integer


if(length =0)
Return String.Empty
end if

if length >= 366 then
year=cstr(Math.Floor (length/ 365.25)) 
length =(length  Mod 365.25)
length =(year * 365)
year =cstr(length)

end if

if length>31 Andalso length<366  then

month=cstr (Math.Floor(length/30.4375))
length=(length  Mod 30.4375)
length=(month * 30)
month=cstr(length)

end if

if length<31 Then
day =cstr(length) 
end if

if length = 0 then
Return String.Empty
end if

sum= ((year)+(month)+(day))

return(sum)

End Function

谢谢

4

2 回答 2

0
于 2012-11-05T23:30:34.190 回答
0

你的逻辑有一些问题。

  1. 首先,您根本不应该将任何内容转换为字符串(CStr)。您可能需要在 SSRS 中执行此操作的唯一原因是显示工具提示或其他一些仅字符串字段。您当然不应该在对它们求和之前尝试这样做,尽管这无论如何都不会像您期望的那样起作用。
  2. 其次,您的函数采用的参数是“长度”,此代码假定为天数。然后,您将返回天数。该函数似乎没有其他目的,只是将天数拆分为年(365.25)和月(30)的设定值,然后重新组合以将这个标准化的年月长度相加。除了你似乎以粗略的方式加入了闰年。谁说 366 天就是一年?它可以是闰年,也可以是 1 年零 1 天。
  3. 您声明的变量都是整数,但您在数学中使用浮点数或小数。
  4. 您正在获取年份和月份的值,然后在不必要的步骤中用其他值覆盖它们。

假设您有充分的理由这样做(请分享!)并且不能使用简单的东西,例如:=datediff(d,fields!FirstDate.Value,fields!SecondDate.value)

然后我可以告诉你这个函数哪里出错了。

在这部分:

if length >= 366 then
year=cstr(Math.Floor (length/ 365.25)) 
length =(length  Mod 365.25)
length =(year * 365)
year =cstr(length)

取一个输入值 367。第二行会给你 year=1。第三行会给你长度=0。是的,零。您已将所有内容声明为整数,并且整数将隐式截断任何尾数(小数点后的位)。您想将这些声明为浮点或更好的精确数字。第四行用 Year(1) * 365 = 365 覆盖您的长度值。第五行然后将 365 转换为字符串并将其分配给 year,但 year 是一个整数,因此它被隐式转换回整数。如果你的变量被声明为正确的类型,你只需要这 3 行,但同样 366 天的事情是非常农业的。它处理边缘情况很差。

if length >= 366 then
year=cstr(Math.Floor (length/ 365.25)) 
length =(length  Mod 365.25)

下一部分:

if length>31 Andalso length<366  then

这也是不必要的。您已经在代码的第一部分确保长度现在小于 365(如果变量是正确的数据类型,那么长度将小于 365.25)

这就够了:

if length>31 then

在下一部分中你已经做了同样的事情,前两行就足够了,再次假设你的数据类型是固定的。

month=cstr (Math.Floor(length/30.4375))
length=(length  Mod 30.4375)
length=(month * 30)
month=cstr(length)

在下一部分中,它可以工作(除了 Cstr),但很不舒服。在测试长度是否 < 31 之前,您应该检查长度 = 0。

if length<31 Then
day =cstr(length) 
end if

if length = 0 then
Return String.Empty
end if

你在评论中说了两个相互矛盾的陈述。首先你有像年/月天这样的输入,其次你有开始和结束日期参数。如果第二个为真并且您有开始/结束日期,则丢弃此代码并使用 datediff。内置函数已经考虑了闰年和实际月份的长度,您无需使用粗略的平均值。

似乎您为此使用了自定义代码,这是对不存在问题的复杂解决方案。

于 2012-11-05T23:53:43.250 回答