不同日期格式的区域日期格式和数据库日期格式导致的SQL Server错误。

4

我的地区日期设置为

yyyymmdd

现在,我的SQL Server的默认DateTime设置为:
mm/dd/yyyy

我的数据库列的数据类型是DateTime,其中包含的值与数据库的格式相同。

我的代码是使用Delphi7编写的。

当从数据库中获取记录时,会触发以下查询:

select * 
from EMPLOYEE 
where JOINING_DATE > '08292017'

在上面的查询中,期望的日期格式为08/29/201708-29-2017

在Delphi 7中,我使用GetLocaleChar方法从区域设置中获取分隔符的值;以下是此代码:

GetLocaleChar(DefaultLCID, LOCALE_SDATE, '/')

在哪里

DefaultLCID := GetThreadLocale;

另一个问题:在SQL Server中,使用哪种分隔符是否重要,不考虑数据库列中使用的分隔符?


2
使用参数化查询,你就没问题了。 - Victoria
2
除此之外,您应该对查询进行参数化。这篇文章可能会很有趣:http://www.karaszi.com/SQLServer/info_datetime.asp#DtFormatsInput - GuidoG
1个回答

6
我的数据库字段的数据类型是 DateTime,它包含的值与数据库中的格式相同。
在 SQL Server 中,Datetime 值以二进制格式存储。Datetime 值的字符串值“mm/dd/yyyy”完全由应用程序表示层控制。
当从数据库获取记录时,它会触发一个查询,如下所示:select * from EMPLOYEE where JOINING_DATE > '08292017'。
我建议您简单地将查询参数化,而不是传递日期文字字符串。这将避免日期格式字符串问题,并提供其他好处,如性能和安全性。
如果必须将日期或datetime文字传递给 SQL Server,请使用未分隔的“YYYYMMDD”格式,以便无论 SQL 会话 DATEFORMAT 设置如何,都可以正确解释它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接