You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中仅向数据库插入日期(不含时间)?

解决SQL Server中插入仅日期(不含时间)的问题

首先咱们先理清核心问题:为什么数据库里总是存成2019-10-19 00:00:00.000这种带时间的值?

  • 如果你的departure_date和arrival_date字段类型是DATETIME或DATETIME2,SQL Server会自动为日期补充0点的时间部分——这是这类数据类型的固有特性,它们本身就是用来存储日期+时间的。
  • 要是你想存储阶段就只保留日期,需要把数据库字段类型改成DATE(SQL Server 2008及以上版本支持),这个类型专门用来存日期,完全没有时间部分。

另外必须提醒你:你的代码存在严重的SQL注入风险,直接拼接字符串生成SQL语句是非常危险的操作,必须改用参数化查询。而且参数化查询还能更精准地传递日期类型,避免格式转换带来的各种问题。

下面是修正后的完整代码:

SqlCommand cmd2 = conn.CreateCommand(); 
cmd2.CommandType = CommandType.Text; 

// 解析前端输入的日期和时间
DateTime departureDate = DateTime.ParseExact(TextBox_DepartureDate.Text, "dd/MM/yyyy", null); 
DateTime arrivalDate = DateTime.ParseExact(TextBox_ArrivalDate.Text, "dd/MM/yyyy", null); 
string departureTimeStr = TextBox_DepartureTime.Text + " " + DropDownListAMPM.SelectedValue; 
string arrivalTimeStr = TextBox_ArrivalTime.Text + " " + DropDownList_AMPM2.SelectedValue; 

// 日期合法性校验
if (departureDate.Date <= DateTime.Now.Date) { 
    Label_EditTableMessage.ForeColor = System.Drawing.Color.Red; 
    Label_EditTableMessage.Text = "Departure Date Cannot be in the past"; 
} else if (arrivalDate.Date <= departureDate.Date) { 
    Label_EditTableMessage.ForeColor = System.Drawing.Color.Red; 
    Label_EditTableMessage.Text = "Return Date Cannot be Less than the Departure Date"; 
} else { 
    // 使用参数化SQL,彻底避免注入风险
    cmd2.CommandText = @"INSERT INTO flight(airline_id, flight_number, numer_seats, departure_city, destination_city, departure_time, arrival_time, departure_date, arrival_date)
                         VALUES (@AirlineId, @FlightNumber, @NumSeats, @DepartureCity, @DestinationCity, @DepartureTime, @ArrivalTime, @DepartureDate, @ArrivalDate)";

    // 逐一添加参数,确保类型匹配
    cmd2.Parameters.AddWithValue("@AirlineId", DropDownList_AirlineId.SelectedValue);
    cmd2.Parameters.AddWithValue("@FlightNumber", TextBox_FlightNumber.Text);
    cmd2.Parameters.AddWithValue("@NumSeats", TextBox_NumerSeats.Text);
    cmd2.Parameters.AddWithValue("@DepartureCity", TextBox_DepartureCity.Text);
    cmd2.Parameters.AddWithValue("@DestinationCity", TextBox_DestinationCity.Text);
    cmd2.Parameters.AddWithValue("@DepartureTime", departureTimeStr);
    cmd2.Parameters.AddWithValue("@ArrivalTime", arrivalTimeStr);
    // 传递仅日期部分,即使字段是DATETIME,也会自动补0点时间,但参数化方式更可靠
    cmd2.Parameters.AddWithValue("@DepartureDate", departureDate.Date);
    cmd2.Parameters.AddWithValue("@ArrivalDate", arrivalDate.Date);

    cmd2.ExecuteNonQuery(); 
    Label_EditTableMessage.ForeColor = System.Drawing.Color.Green; 
    Label_EditTableMessage.Text = "Flight Added"; 
    EmptyTextBoxes(); 
    GridView_Flight.DataBind(); 
}

额外补充两点:

  1. 如果你没法修改数据库字段类型(比如必须用DATETIME),那么在查询数据时,可以用CONVERT(VARCHAR, departure_date, 23)或者FORMAT(departure_date, 'yyyy-MM-dd')来提取仅日期的字符串用于显示。
  2. 参数化查询是编写数据库操作代码的最佳实践,除了安全,还能避免很多因字符串格式不匹配导致的错误。

内容的提问来源于stack exchange,提问作者sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:54