C# DateTime 不适用于 MSSQL 存储过程

C# DateTime not working for MSSQL stored procedure

Html:

<asp:TextBox ID="startDate" runat="server" </asp:TextBox>

<asp:TextBox ID="endDate" runat="server"></asp:TextBox>

<asp:Button ID="btnSearch" runat="server" Text="search" OnClick="btnSearch_Click"/>

日期选择器Js/Jquery

 $("#startDate").datepicker(
            {
                onSelect: function (date) {
                    var date1 = $('#startDate').datepicker('getDate');
                    var date = new Date(Date.parse(date1));
                    date.setDate(date.getDate() + 0);
                    var newDate = date.toDateString();
                    newDate = new Date(Date.parse(newDate));
                    $('#endDate').datepicker("option", "minDate", newDate);
                },
                onClose: function (dateText, inst) {
                    $(this).datepicker('option', 'dateFormat', 'dd.mm.yy');
                },
            });

        $("#endDate").datepicker({
            onClose: function (dateText, inst) {
                $(this).datepicker('option', 'dateFormat', 'dd.mm.yy');
            },
        });

Asp.net 代码隐藏

protected void btnSearch_Click(object sender, EventArgs e)
{
    startDate.Text = Request.Form[startDate.UniqueID]; // I get startDate
    endDate.Text = Request.Form[endDate.UniqueID]; // I get endDate

    spGetReport(Tools.AbsoluteStart(Convert.ToDateTime(startDate.Text)),
    Tools.AbsoluteEnd(Convert.ToDateTime(endDate.Text)));
}

存储过程参数class

 private DataSet spGetReport(DateTime startDate, DateTime EndDate)
 {
     // Connection settings here.. no code for simple question

     SqlCommand scmd = new SqlCommand();
     scmd.CommandText = "sp_Report";

     scmd.Parameters.Add("@startDate", SqlDbType.DateTime);
     scmd.Parameters["@startDate"].Value = startDate;
     scmd.Parameters.Add("@EndDate", SqlDbType.DateTime);
     scmd.Parameters["@EndDate"].Value = EndDate;

     // etc...
 }

帮助程序 Class 以获得一天的最小日期时间和最大日期时间。

/// gets 00:00:00 of a day
public static DateTime AbsoluteStart(DateTime dateTime)
{
    return dateTime.Date;
}

/// gets 23:59:59 of a day
public static DateTime AbsoluteEnd(DateTime dateTime)
{
    return dateTime.Date.AddDays(1).AddSeconds(-1);
}

存储过程

ALTER  procedure [dbo].[sp_Report] 
(
   @startDatedatetime,
   @EndDate datetime
)
as

select * from MyTable where startDAteColumn between CAST(@startDate AS VARCHAR(100) and CAST(@EndDateAS VARCHAR(100)

注: 存储过程有效。

我有非常复杂的存储过程查询,这就是我在 "Store Procedured" 部分显示简单代码的原因。问题是关于搜索数据。当我在 [=] 之间搜索数据时=38=]startdate 和 enddate 数据永远不会正确,因为 casting 发送参数有问题 来自 c# asp.net 代码 behind.I 认为问题的发生是因为在 t sql 端进行了转换。我无法在 sql side.I 中更改强制转换,必须在后面的 asp.net 代码中更改。

无论你有什么建议我都可以 apply.Where 我想念 asp.net 代码隐藏?

谢谢。

让我们倒过来 - 你的存储过程永远不会工作,你没有为 where 指定一个字段,并且它缺少 2 个右括号。

select * from MyTable 
where between CAST(@startDate AS VARCHAR(100) and CAST(@EndDateAS VARCHAR(100)

应该是

select * from MyTable 
where SOMEFIELD between CAST(@startDate AS VARCHAR(100)) and CAST(@EndDateAS VARCHAR(100))

此外,使用日期时 BETWEEN 关键字必须是实际日期 - 转换为 VARCHAR 的日期不太可能起作用。

接下来,使用 Convert.ToDateTime(startDate.Text) 是一种从字符串转换为日期的容易出错的方法。相反,您应该调用 DateTime.ParseExact(或者更恰当地说 TryParseExact)指定要使用的格式。