将C#函数转换为SQL Server以计算总周数

将C#函数转换为SQL Server以计算总周数,c#,sql,sql-server,sql-server-2008-r2,C#,Sql,Sql Server,Sql Server 2008 R2,我有以下函数,它根据BillingStartDate和billingaddate计算总周数。这是在C#程序中计算的,但是我正在创建一个SQL查询,并且希望也计算这个值 这是C#函数: private void calculateTotalWeeks() { if (!((dtpBillEnd.ValueIsDbNull) || (dtpBillStart.ValueIsDbNull))) { if (((DateTime)dtpBill

我有以下函数,它根据
BillingStartDate
billingaddate
计算总周数。这是在C#程序中计算的,但是我正在创建一个SQL查询,并且希望也计算这个值

这是C#函数:

 private void calculateTotalWeeks()
 {
        if (!((dtpBillEnd.ValueIsDbNull) || (dtpBillStart.ValueIsDbNull)))
        {
            if (((DateTime)dtpBillEnd.Value).CompareTo((DateTime)dtpBillStart.Value) < 0)
            {
                lblTotalWeeks.Text = "Invalid End Date";
            }
            else
            {
                TimeSpan ts = ((DateTime)dtpBillEnd.Value).AddDays(1) - (DateTime)dtpBillStart.Value;
                lblTotalWeeks.Text = ((Double)ts.TotalDays / 7.0).ToString("0.0");

                if (Int32.Parse(lblTotalWeeks.Text.Substring(lblTotalWeeks.Text.Length - 1, 1)) % 2 != 0)
                {
                    string strBase = lblTotalWeeks.Text.Substring(0, lblTotalWeeks.Text.Length - 1);
                    lblTotalWeeks.Text = strBase + (Int32.Parse(lblTotalWeeks.Text.Substring(lblTotalWeeks.Text.Length - 1, 1)) - 1);
                }
            }
        }
    }
这在很大程度上是可行的,但在某些情况下,例如,开始日期和结束日期之间的26.0天,它显示的是3.71,而不是3.6


非常感谢您的帮助

如果您希望最终结果为3周零5天,那么您可以使用以下查询:

SELECT      Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) /7, 20) + ' weeks and' +
            Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) %7, 20) + ' days'
SELECT      Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) /7, 20) + '.' + Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) %7, 20) + ' weeks'
这将给你一个结果

3 weeks and 5 days
3.5 weeks
如果日期差为26天

相反,如果希望最终结果为3.5周,则可以使用以下查询:

SELECT      Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) /7, 20) + ' weeks and' +
            Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) %7, 20) + ' days'
SELECT      Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) /7, 20) + '.' + Convert(nvarchar, DATEDIFF(D, @BillingStartDate, @BillingEndDate) %7, 20) + ' weeks'
这将给你一个结果

3 weeks and 5 days
3.5 weeks
如果日期差为26天

编辑:

此外,请在此处修改您的C#代码:

lblTotalWeeks.Text = ((Double)ts.TotalDays / 7.0).ToString("0.0");
应该是

lblTotalWeeks.Text = Convert.ToString((Double)ts.TotalDays / 7.0));

希望这有帮助

26/7=3.71。你为什么期望3.6呢?因为这就是C代码返回的结果。问题是,为什么这两个函数返回不同的数字,因为C#函数输出的是3.6,而sql输出的是3.71。我想得到与c#中相同的结果。这是否等同于:((DATEDIFF(D,DATEADD(D,1.D.BillingStartDate,D.BillingEndDate))/7.0)C#输出3.6的唯一原因是因为
if
语句中的额外逻辑。原始
lblTotalWeeks.Text=((Double)ts.TotalDays/7.0)。ToString(“0.0”);
行确实会产生
3.7
,如果将字符串格式更改为
“0.00”
,则会产生
3.71
。是的,正如@goric所说,“00”说明符会使值四舍五入到小数点之前的最近数字。将3.714格式化为“0.0”将得到值3.7。检查编辑的答案。这是经过测试的,因此将按照答案中的说明工作。