在 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 中以日期时间格式转换日期时间字符串