2011-09-23 67 views
4

我简短的是实现其中有看起来像下面“GetValuesSqlStatement”的方法的接口的最佳实践:现在什么是查询日期的SQL时,参数化查询是不可能

public string SqlPattern { get { ... } } 
//this varies; eg. "SELECT name FROM someTable WHERE startDate < {0}" 

public string DatabaseType { get { ... } } 
//this varies; eg. "SqlServer" 

public string GetValuesSqlStatement(List<object> paramValues) 
{ 
    //...desired logic here, using DatabaseType, SqlPattern and paramValues 
} 

,因为这必须产生一个可执行的SQL语句,我不能在执行查询时使用参数。我必须实现的接口是不可协商的。继续确保结果中的日期由数据库查询引擎正确解释的最佳方法是什么?假设paramValues包含.NET DateTime对象,在插入SQL模式字符串之前,这些对象应该如何格式化为字符串?必须数据库中最常用的通用日期格式是什么? (比如'dd-mmm-yyyy')。

注:我只需要真正担心从2005年开始的SQL Server和Oracle 10g以上。所以SQL必须是有效的T SQL和PL SQL,并且在这两种口味中意味着相同的东西。

回答

1

我认为SQL Server的唯一明确的日期格式是年月日:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

http://www2.sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx

甲骨文使用DATE“YYYY-MM-DD '符号:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements003.htm#BABGIGCJ

虽然可能有这个符号适用于两种情况,我怀疑是否有适用于所有可能的区域服务器设置的符号。如你所说,YYYY-MON-DD可能是有用的 - 这是Oracle的默认设置。

+0

那么我有DatabaseType字符串来帮助我构建这个查询。如果你说'yyyy-mm-dd'适用于除SQL Server之外的所有应用程序,那么我可以使用条件逻辑。如果'yyyy-mon-dd'同时适用于SQL Server和Oracle,那当然会满足我的需求,但这并不一定是我猜的最佳实践。 – Lisa

+1

@Lisa,你必须尝试。我从来没有法国服务器,我总是使用YYYY-MM-DD。您会在Aaron的文章中看到该连接项,它不适用于新的date和datetime2数据类型。在SQL Server中。根据我在Oracle中的经验,文字总是要求DATE限定词将它们与字符串区分开来。你可能需要将你的日期字符串生成封装在特定于数据库的东西中。 –

+0

我突然有了一个更好的主意,哪种让这个问题没那么有用。即使不是严格回答问题,我也可以将其作为第三个答案添加。 – Lisa

1

如果你使用任何数据库的日期格式'yyyy-mm-dd',你应该没问题。这是根据ISO 8601(http://www.iso.org/iso/date_and_time_format

+1

在SQL Server中,问题依然存在http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx(Connect http: //connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=290971) –

+0

我认为这将是最普遍的,你可以得到。你知道你的服务器本地化吗? – mwan

+0

遍布全球。好的,这个特定的项目将是+ 8GMT或+ 9.30GMT,但不能让它突然不能为不同的客户工作。 – Lisa

0

即使它从问题的范围转向,我也提供了我自己的答案,因为这可能对于有类似问题的其他人有用。

我刚刚意识到我可以简单地期望每个实例(或世界上不同地方的每个客户)在参数占位符的后半部分中可选地指定格式字符串。例如。执行:

public string SqlPattern { get { 
    return "SELECT name FROM someTable WHERE startDate < {0:yyyy-mm-dd}"; 
} } 

然后我的组件不需要担心如何格式化日期。默认情况下,我可以使用'yyyymmdd',或者更好的是使用服务器的文化来选择默认值。否则使用自定义指定的模式。这将是一种通用的方法,适用于需要格式化为SQL字符串的其他类型。