C#中的日期时间与SQL中的日期时间以及来自SQL Server的GETDATE()的比较

3
我在SQL Server存储过程中使用GETDATE()插入日期到SQL Server数据库表中。
之后,我需要实现一个基于datetime输入参数的C#函数,以查找日期是否保存在表中。
C#和SQL中的datetime是不同的。如何将C# datetime转换为SQL datetime,其格式为yyyy-mm-ddT:yy:mm:ss.mmm?我需要明确指定yyyy-mm-ddT:yy:mm:ss.mmm
欢迎提出所有建议/可能的方法。

1
我不确定格式与比较有什么关系? - Mike Perrenoud
1
不,T-SQL中的DATETIME和.NET中的DateTime不同 - 你可以将SQL Server中的任何DATETIME表示为.NET DateTime。在范围(1753年1月1日至9999年12月31日)和精度(3.33毫秒)方面,SQL Server中的DATETIME有限制,但它在SQL Server 2008中已被弃用,不应再使用;改用DATE(如果只需要日期-没有时间)或DATETIME2(n) - marc_s
5个回答

5

.Net framework 和 SQL Server 中的 DateTime 类型字段的格式并不影响其功能,格式设置仅用于显示输出。

如果你的 SQL Server 字段为 DateTime 类型,则可以使用参数化查询从 C# 代码中查询它,例如:

public DataTable GetRecords(DateTime dtParameter)
{
    DataTable dt = null;
    using (SqlConnection conn = new SqlConnection("connection string"))
    {
        using (SqlCommand cmd = new SqlCommand("SELECT * from yourTable where DateField = @dateparameter"))
        {
            conn.Open();
            cmd.Parameters.AddWithValue("@dateparameter",dtParameter);
            SqlDataReader dr = cmd.ExecuteReader();
            //...rest of the code
            dt.Load(dr);
        }
    }
    return dt;
}

你是否要求用户提供秒和毫秒? - Dan Bracuk
我保存了日期时间。我发现在SQL表中保存的是例如2014-01-13 16:53.00.121。我该如何在C#中转换它? - YAKOVM
@DanBracuk-我该怎么问他?我刚刚定义了一个来自System.datetime类型的输入。因此,向用户建议的格式类似于1/14/2014 4:44 PM。 - YAKOVM
@Yakov,你所看到的格式是基于你的本地设置的。当你在数据库中进行比较时,显示格式并不重要,1/14/2014 4:44 PM2014-1-14 16:44都是相同的。 - Habib
让我们在聊天中继续这个讨论。点击此处进入聊天室 - YAKOVM
显示剩余9条评论

4

C# 和 SQL 之间的日期时间是完全兼容的。 如果您将它们作为 DateTime 传递,格式不应该有任何区别。如果您要生成 SQL 字符串,则强烈建议更改为使用 SQL 参数,这样您就不必担心任何格式问题。


2
一个 datetime 没有任何格式,它只有一个值。SQL-DateTimes 和 C# DateTimes 是兼容的。所以不要将其转换为 string,而是将其作为 datetime 参数传递到数据库中。
然后,如果 DateTime 值在 SqlDateTime.MinValue(1753 年 1 月 1 日)和 SqlDateTime.MaxValue(9999 年 12 月 31 日)之间,您就会很安全。

我已经传递了这个值。但是SQL存储过程在表中找不到这个值。除此之外,它是存在的。可能是缺少了第二部分。 - YAKOVM

2
如果您正在使用Entity Framework,并且您的数据库使用的是datetime而不是datetime2,则需要使用SqlDateTime来匹配.Net的纳秒精度,而不是sql的毫秒精度。您可以在.net中使用DateTime变量作为SqlDateTime实例,然后您就可以将记录唯一地标识到毫秒级别。
System.Data.SqlTypes.SqlDateTime entry2 = new System.Data.SqlTypes.SqlDateTime(new DateTime(dto.LookUpDateTime));
DateTime entry = entry2.Value;

var existticket = from db in context.Tickets
                              where db.LookupDateTime == entry && db.UserId == UserId
                              select db;

2

在客户端代码中不应该写入 DateTime.Now 来插入数据库,因为这将基于客户端本地时间;请采取以下措施:

public DateTime GetDatabaseTime()
{
    var parameter = new SqlParameter("time", SqlDbType.DateTime2)
    {
        Direction = ParameterDirection.Output
    };

    using (var connection = new SqlConnection(ConnectionString))
    {
        connection.Open();

        using (var command = new SqlConnection("SELECT @time = SYSDATETIME()", connection))
        {
            command.ExecuteNonQuery();
        }
    }

    return (DateTime)parameter.Value;
}

同时,在 SQL Server 中你不应该使用 DATETIME,而应该始终使用 DATETIME2。因为 DATETIME 不如 C#::DateTime 准确,并且会导致舍入误差。这是我通过惨痛的经验得知的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接