如何正确地将日期时间从 c# 传递到 sql?

Posted

技术标签:

【中文标题】如何正确地将日期时间从 c# 传递到 sql?【英文标题】:How to pass datetime from c# to sql correctly? 【发布时间】:2011-09-28 01:49:35 【问题描述】:

我有一张表格,其中的日期时间格式为:

2011-07-01 15:17:33.357

当我对对象执行 .ToString() 时,我正在使用 c# DateTime,我得到的 DateTime 格式为:

04/07/2011 06:06:17

我想知道如何正确传递正确的 DateTime,因为当我运行代码中的 SQL 时它不起作用(即选择正确的 DateTime)。我无法使用 SQL 分析器。

这是代码:

//looks to if a user has had any activity in within the last time specified
        public bool IsUserActivitySinceSuppliedTime(int userId, DateTime since)
        
            //get everything since the datetime specified [usually 5 hours as this is 
            //how long the session lasts for
            string sql = "SELECT * FROM tbl_webLogging WHERE userid = @userid AND DateAdded > @sinceDateTime";

            SqlParameter sinceDateTimeParam = new SqlParameter("@sinceDateTime", SqlDbType.DateTime);
            sinceDateTimeParam.Value = since;

            SqlCommand command = new SqlCommand(sql);
            command.Parameters.AddWithValue("@userid", userId);
            command.Parameters.Add(sinceDateTimeParam);


            using (SqlDataReader DataReader = GetDataReader(command))
            
                if (DataReader.HasRows)
                
                    return true;
                
                else
                
                    return false;
                
            


        

更新************************

我在数据上运行了以下内容:

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '2011-07-01 07:19:58.000'

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '04/07/2011 07:19:58'

一个返回 53 条记录,另一个返回 69 条记录。怎么会这样?当我将 DateTime (04/07/2011 07:19:58) 从 c# 传递到 SQL 时,根本没有记录显示!

【问题讨论】:

表中“添加日期”列的类型是什么?是日期时间吗?还是某种 varchar? 您能否确认DateAdded 的类型为datetime,而不是[n]varchar(x) 之类的类型? 那么为什么 c# datetime 会返回 0 条记录呢? (调试器说它是'04/07/2011 07:19:58')@Maras 数据类型是日期时间...... 您在运行时签入调试器时的用户 ID 是 1 吗?只是检查。 好吧,对于 sql 示例,您使用的两个日期不一样 :) --- 可能是错字?然后首先使用 7 月 1 日,第二个使用 7 月 4 日。对于c#代码:你确定你传入的值是正确的吗? 【参考方案1】:

您已经通过使用带有来自DateTime 的值的DateTime 参数正确地完成了它,所以它应该已经工作了。忘记ToString() - 因为这里没有使用它。

如果有差异,很可能是两个环境之间的精度不同;也许选择一个舍入(秒,也许?)并使用它。还要记住 UTC/local/unknown(数据库没有日期“种类”的概念;.NET 有)。

我有一张表格,其中的日期时间格式为:2011-07-01 15:17:33.357

请注意,数据库中的日期时间不是任何这样的格式;那只是您的查询客户端向您展示善意的谎言。它被存储为一个数字(甚至这是一个实现细节),因为人们有一种奇怪的倾向,没有意识到你显示的日期与40723.6371916281 相同。愚蠢的人类。通过将其简单地视为“日期时间”,您应该不会遇到任何问题。

【讨论】:

只是没有得到任何回报。注意:我只是说 To.String 是 ... 因为我正在查看调试器。但是当我运行上面的代码时,它不会得到任何行。我该如何调试? @Pete2k 好,有匹配的数据吗?这是>>= 的问题吗?【参考方案2】:

我遇到了很多涉及 C# 和 SqlServer 的问题。我最终做了以下事情:

    在 SQL Server 上,我使用 DateTime 列类型 在 c# 上,我使用 .ToString("yyyy-MM-dd HH:mm:ss") 方法

还要确保您的所有机器都在同一时区运行。

关于您获得的不同结果集,您的第一个示例是“July First”,而第二个示例是“4th of July” ...

另外,第二个例子也可以理解为“4 月 7 日”,这取决于你的服务器本地化配置(我的解决方案没有遇到这个问题)。

编辑:hh 已替换为 HH,因为与具有 24 小时时钟的系统相比,它似乎无法在具有 AM/PM 的系统上捕获正确的小时。请参阅下面的 cmets。

【讨论】:

.ToString("yyyy-MM-dd hh:mm:ss") 不是消除歧义的最佳方法;更好的方法是传递类型化的数据,因此不会模棱两可。问题中的代码比使用任何特定格式的ToString(...)更好 有问题的代码由于某种原因无法正常工作,因此更好的解决方案是使代码正常工作并提供预期的结果。之后有很多事情需要考虑,什么才是“更好”的解决方案。 我使用.ToString(yyyy-MM-ddThh:mm:ss)。不知何故,我总是知道会发生什么。为 SqlDateTime 指定类型一次对我不起作用,我最终得到了2012-01-30 AM 10:15:30,而在 SQL 中它是2012-01-30 10:15:30。不太清楚为什么......只是我的 2 美分 .. 为此,您应该使用 "yyyy-MM-dd HH:mm:ss" 作为格式字符串(注意 HH 表示 24 小时而不是 hh 表示 12 小时),或者确保您输入 tt在您的hh:mm:ss 之后包括上午/下午。 使用 .ToString("yyyy-MM-dd hh:mm:ss") 将返回 1:00:00 作为时间,无论原始 DateTime 是下午 1 点还是凌晨 1 点。 SQL 会将其解释为凌晨 1 点。正如@JoeBrockhaus 所说,正确的时间格式是HH:mm:ss

以上是关于如何正确地将日期时间从 c# 传递到 sql?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将浮点指针从 C 库传递到其 C# 包装器

如何正确地将 C 数组传递给 C#?

如何正确地将数据帧的所有日期时间列转换为 iso 格式

将日期时间从 javascript 传递给 c# (Controller)

从 Jquery 到 C# Web API 传递和处理英国日期格式

将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”