C# 在C中格式化SQL友好的日期/时间#

C# 在C中格式化SQL友好的日期/时间#,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,我正在为我的应用程序构建一些测试场景。为了做到这一点,我有一些代码生成一些SQL来帮助我正确地测试。生成的SQL示例如下所示: INSERT INTO MyTable ( [ID], [Name], [CheckInDate], [CheckOutDate] ) VALUES ( 1, 'A title', 'Sat, 17 Dec 2011 14:33:12 GMT', 'Sat, 17 Dec 2011 15:13:12 GMT' ) 当我尝试执行此SQL时,我收到

我正在为我的应用程序构建一些测试场景。为了做到这一点,我有一些代码生成一些SQL来帮助我正确地测试。生成的SQL示例如下所示:

INSERT INTO MyTable
(
 [ID],
 [Name],
 [CheckInDate],
 [CheckOutDate]
)
VALUES
(
  1,
  'A title',
  'Sat, 17 Dec 2011 14:33:12 GMT',
  'Sat, 17 Dec 2011 15:13:12 GMT'
)
当我尝试执行此SQL时,我收到以下消息: 从字符串转换日期和/或时间时,转换失败

如何格式化日期/时间字符串,以便SQL Server 2008接受它们?我真的需要我的C#代码来生成SQL(包括日期/时间项),以便正确地创建测试


谢谢大家!

解决此问题的方法是使用SQL Server支持的ISO-8601日期格式——无论您的SQL Server语言和日期格式设置如何,此格式始终有效

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段)-注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • YYYY-MM-DDTHH:MM:SS
    用于日期和时间-此处注意:此格式有破折号
这对SQL Server 2000及更新版本有效

如果您使用SQL Server 2008和
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置


不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用
YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。

更好的方法是根本不格式化日期,参数化
insert
语句,并将日期作为命令参数传递。

您可以使用

所以你的命令是:

INSERT INTO MyTable
(
 [ID],
 [Name],
 [CheckInDate],
 [CheckOutDate]
)
VALUES
(
  1,
  'A title',
  @CheckInDate,
  @CheckOutDate
)
您可以这样插入日期:

SqlParameter checkin = new SqlParameter("@CheckInDate", SqlDbType.DateTime);
SqlParameter checkout = new SqlParameter("@CheckOutDate", SqlDbType.DateTime);

checkin.Value = DateTime.Today; // Format these to the desired dates
checkout.Value = DateTime.Today;

command.Parameters.Add(checkin);
command.Parameters.Add(checkout);

或者使用参数化查询,指定类型,让奇妙的库世界为您处理它?@Dems:同意-这更好-但如果出于任何原因需要字符串,请使用ISO-8601格式…我仍然得到错误。我正在生成我的日期/时间,如下所示。我做错了什么?checkInDate.ToString(“yyyy-MM-ddHH:MM:ss”)@monodeloveler:如果您使用时间格式,则需要使用
T
checkInDate.ToString(“yyy-MM-ddHH:MM:ss”)
将时间部分与日期分开,您的第二点很好。然而,阅读@marc_的答案,你会发现你的第一点并不能保证有效。是否有效取决于服务器和客户端的设置:服务器的原因是它还必须接受dd-mm-yyyy订单,客户端的原因是/使用客户端的日期分隔符,您希望它与服务器的匹配。您应该在SQL中删除参数周围的引号,否则您将得到一个文本字符串
“@CheckInDate”