【问题标题】:what is the correct way to format a datetime in SQL server datetime field在 SQL Server 日期时间字段中格式化日期时间的正确方法是什么
【发布时间】:2010-12-28 05:46:51
【问题描述】:

我在 C# 中有一个 dateTime 对象,我想插入 SQL Server 日期时间字段。正确的格式是什么?

【问题讨论】:

  • 您可能不应该在代码中构建 SQL 字符串。相反,您应该考虑使用存储过程、参数化查询或 ORM。当您传递对象时,任何这些都可以解决您的格式化问题,您不必进行任何字符串格式化。

标签: c# sql datetime


【解决方案1】:

正确的方法是使用参数化查询,不是文本格式。然后你可以只使用强类型的SqlDbType.DateTime 参数。

(如果您绝对必须使用文本格式来执行此操作 - 我强烈建议不要这样做 - 那么像 yyyyMMdd HH:mm:ss 这样的东西应该可以解决问题。)

【讨论】:

  • 我不会仍然将字符串传递给参数化查询并遇到同样的问题吗?
  • 实际上,无论语言和区域设置如何,保证在任何 SQL Server 上都可以使用的格式是 yyyyMMdd HH:mm:ss(没有破折号 - 在某些语言设置中会导致问题)
  • @marc_s:我已经更新了答案以使用安全的所有情况格式。
  • 尝试使用 .net 类使用 BETWEEN dt1 AND dt2 条件查询在 DateTime 列上索引的表,您将很快找到查询提示或内联值的用途,两者这需要正确的格式(提示:查询优化器并不总是足够聪明,无法确定您只需要几行,我们开始使用 tablescan)
【解决方案2】:

为了扩展@Luke 的回答,前几天我遇到了这个错误。

yyyy-MM-dd HH:mm:ss 格式在 SQL Server 2005 上存在区域设置/语言问题(例如法语),但在 SQL 2008 中已修复:

所以,不要使用这种格式:yyyy-MM-dd HH:mm:ss(空格分隔符)。

仅使用:yyyy-MM-ddTHH:mm:ss(“T”分隔符)或yyyyMMdd HH:mm:ss(无破折号分隔符)

如果您要生成包含 datetime 常量的脚本,这一点很重要。

Jamie Thomson's article on SQL Blog

【讨论】:

    【解决方案3】:

    使用SET DATEFORMAT

    样本took from here

         SET NOCOUNT ON 
         CREATE TABLE X(EXAMPLE INT, D SMALLDATETIME)
         -- EXAMPLE 1
         SET DATEFORMAT MDY
         INSERT INTO X VALUES (1, '10/30/56')
         -- EXAMPLE 2
         SET DATEFORMAT YDM
         INSERT INTO X VALUES (2, '56/31/10')
         -- EXAMPLE 3 
         SET DATEFORMAT YMD
         INSERT INTO X VALUES (3, '56/10/31')
         SELECT * FROM X
    

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多