c# -如何检索SQL Server时间(7)到TimeSpan

本文关键字:时间 Server TimeSpan SQL 检索 何检索 | 更新日期: 2023-09-27 18:14:11

我试图了解如何从定义为Time(7)的SQL Server 2012表列检索时间数据。我找遍了所有地方,并为此挣扎。这里是一些简单的代码,我正在使用,只是试图让它工作。你能帮帮我吗?

当下面的代码运行时(使用Visual Studio 2013),我得到TimeSpan DBStartTime...行上的错误:

无法强制转换"System"类型的对象。时间跨度'到类型'System.IConvertible'

我不知道如何解决这个问题。

var cnnString = ConfigurationManager.ConnectionStrings["TaktBoardsConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(cnnString); 
SqlCommand comm = new SqlCommand();
comm.CommandText = "SELECT * FROM ScheduleDetail WHERE ScheduleID = " + lstShifts.SelectedValue;
comm.CommandType = CommandType.Text;
comm.Connection = conn;
SqlDataReader reader;
conn.Open();
reader = comm.ExecuteReader(); 
while (reader.Read())
{
    TimeSpan DBStartTime = Convert.ToDateTime(reader["StartTime"]).TimeOfDay;
    TimeSpan DBEndTime = Convert.ToDateTime(reader["EndTime"]).TimeOfDay;
    // Add more coding once this works.
}
conn.Close();

c# -如何检索SQL Server时间(7)到TimeSpan

不要使用Convert.ToDateTime阅读器已经返回一个时间跨度,只是做一个直接cast

    TimeSpan DBStartTime = (TimeSpan)reader["StartTime"];
    TimeSpan DBEndTime = (TimeSpan)reader["EndTime"];

同样,与您的问题无关,但是您没有使用ScheduleID = " + lstShifts.SelectedValue;的参数,您真的应该这样做。也不是你使用using语句,当你的代码抛出一个异常,你没有得到你的连接对象关闭。

var cnnString = ConfigurationManager.ConnectionStrings["TaktBoardsConnectionString"].ConnectionString;
using(SqlConnection conn = new SqlConnection(cnnString))
using(SqlCommand comm = new SqlCommand())
{
    comm.CommandText = "SELECT * FROM ScheduleDetail WHERE ScheduleID = @ScheduleID";
    comm.Parameters.Add("@ScheduleID", SqlDbType.Int).Value = lstShifts.SelectedValue;
    comm.CommandType = CommandType.Text;
    comm.Connection = conn;
    conn.Open();
    using(SqlDataReader reader = comm.ExecuteReader())
    {
        while (reader.Read())
        {
             TimeSpan DBStartTime = (TimeSpan)reader["StartTime"];
             TimeSpan DBEndTime = (TimeSpan)reader["EndTime"];
            // Add more coding once this works.
        }
    }
}

我认为你没有理解什么是DateTime和TimeSpanDateTime是一天中的特定时间,例如7月4日晚上8点其中TimeSpan是持续时间,如9小时

因为如果这样,如果你做"7月4日晚上8点"-"7月4日下午3点",你将得到一个5小时的时间跨度,因此,如果你直接从数据库时间7点转换为日期时间,你将得到"1月1日晚上7点",这是完全无用的。直接选择timespan不过在这种情况下你会受到一些限制因为timespan不是Convert中的默认转换类型所以你需要使用旧的转换方式使用括号

if(reader["EndTime"] is TimeSpan)
    DBEndTime = (TimeSpan)reader["EndTime"];