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

时间:2011-12-17 14:04:56

标签: 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 Server 2008接受它们?我真的需要我的C#代码来生成SQL(包括日期/时间项)来正确创建我的测试。

谢谢!

3 个答案:

答案 0 :(得分:9)

解决此问题的方法是使用SQL Server支持的 ISO-8601日期格式 - 此格式始终 - 无论您使用哪种SQL Server语言, dateformat settings。

SQL Server支持ISO-8601 format有两种形式:

  • YYYYMMDD仅适用于日期(无时间部分) - 请注意:没有破折号!,这非常重要! YYYY-MM-DD 独立于SQL Server中的dateformat设置, NOT 可以在所有情况下使用!

或:

  • YYYY-MM-DDTHH:MM:SS了解日期和时间 - 请注意:此格式破折号。

这适用于SQL Server 2000及更高版本。

如果您使用SQL Server 2008和DATE数据类型(仅DATE - DATETIME!),那么您确实也可以使用{{ 1}}格式,也适用于SQL Server中的任何设置。

不要问我为什么这整个话题如此棘手而且有点令人困惑 - 这就是它的方式。但是使用YYYY-MM-DD格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。

答案 1 :(得分:2)

您可以使用SqlParameters

所以你的命令是:

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);

答案 2 :(得分:1)

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