C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()

Posted

技术标签:

【中文标题】C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()【英文标题】:datetime in C# vs, SQL and GETDATE() from SQL Server 【发布时间】:2014-02-02 16:06:00 【问题描述】:

我在 SQL Server 存储过程中使用GETDATE() 将日期插入到 SQL Server 数据库表中。

之后我需要实现一个基于datetime输入参数的C#函数来判断日期是否保存在表格中。

C# 和 SQL 中的日期时间不同。如何从 C# 日期时间转换为具有yyyy-mm-ddT:yy:mm:ss.mmm 形式的 SQL 日期时间?我需要明确指定yyyy-mm-ddT:yy:mm:ss.mmm

对所有提议/可能的方式都很满意。

【问题讨论】:

我完全不确定格式与比较有什么关系? 不,T-SQL 中的 DATETIME 和 .NET 中的 DateTime 没有不同 - 您可以在中表示 any DATETIME SQL Server 作为 .NET DateTime。 SQL Server 中的DATETIME 在范围(1753 年 1 月 1 日至 9999 年 12 月 31 日)和准确性(3.33 毫秒)方面有限制,但无论如何它在 SQL Server 2008 中已被弃用,不应该不再使用;改用DATE(如果你只需要日期-没有时间)或DATETIME2(n) 【参考方案1】:

如果您使用的是实体框架,并且您的数据库使用的是 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 准确,并且会导致舍入错误。我从痛苦的经历中知道这一点。

【讨论】:

【参考方案3】:

datetime 根本没有格式,它有一个值。 SQL-DateTimes 和 C# DateTimes 是兼容的。所以不要将它转换(到string),而是将它作为日期时间参数传递给数据库。

如果 DateTime 值在 SqlDateTime.MinValue(1753 年 1 月 1 日)和 SqlDateTime.MaxValue(9999 年 12 月 31 日)之间,那么您是安全的。

【讨论】:

Ive passed the value.But the sql store procedure doesnt 在表格中找到这个值。除了它在里面。可能缺少秒部分【参考方案4】:

DateTime in .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;

【讨论】:

日期时间应该是用户提供的参数 @Yakov,没关系,你可以用用户传递的参数替换DateTime.Now。它应该是 .Net 框架中的 DateTime 类型。 @Yakov,格式无关紧要。 SQL表中的字段类型是什么? @Yakov :: 如果您从用户那里获取值,您可以简单地将其解析为日期时间对象。这是一篇不错的文章。 dotnetperls.com/datetime-parse 您是否要求您的用户提供秒和毫秒?【参考方案5】:

C# 和 SQL 之间的日期时间是 100% 兼容的。 如果您将它们作为DateTimes 传递,格式应该没有任何区别。如果您正在生成 SQL 字符串,那么我强烈建议您更改为 SQL 参数,这样您就不必担心任何格式问题。

【讨论】:

以上是关于C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期

Microsoft SQL Server 数据库/Visual Studio C#:日期处理

将日期字符串与 SQL Server 中的日期时间进行比较?

在sql server2008中的日期类型是啥

如何将一个字段中的日期与另一字段中的时间结合起来 - MS SQL Server

SQL Server 中的 NEXT VALUE FOR @Sequence 的工作方式是不是与 C# 中的 Interlocked.Increment() 相同? [复制]