在 SQL Server 日期时间字段中格式化日期时间的正确方法是啥

Posted

技术标签:

【中文标题】在 SQL Server 日期时间字段中格式化日期时间的正确方法是啥【英文标题】: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。当您传递对象时,任何这些都可以解决您的格式化问题,您不必进行任何字符串格式化。 【参考方案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

【讨论】:

以上是关于在 SQL Server 日期时间字段中格式化日期时间的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql server中把数据库中的日期字段转换为短日期格式

sql server 日期范围查询

在 SQL Server 中以日期时间格式转换日期时间字符串

sql server 怎样将字符串转化为时间格式

sql server 数据库,在查询sql语句中日期格式转换问题,怎么把原数据年月日时分秒转换成年月日

sql server 获取指定格式的当前日期