.net 当无法进行参数化查询时,在SQL中查询日期的最佳实践是什么

.net 当无法进行参数化查询时,在SQL中查询日期的最佳实践是什么,.net,sql,date-formatting,querying,.net,Sql,Date Formatting,Querying,我的任务是实现一个接口,该接口的方法类似于下面的“GetValuesSqlStatement”: public string SqlPattern { get { ... } } //this varies; eg. "SELECT name FROM someTable WHERE startDate < {0}" public string DatabaseType { get { ... } } //this varies; eg. "SqlServer" public stri

我的任务是实现一个接口,该接口的方法类似于下面的“GetValuesSqlStatement”:

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
}
公共字符串SqlPattern{get{…}
//这是不同的;例如,“从startDate<{0}所在的某个表中选择名称”
公共字符串数据库类型{get{…}
//这是不同的;例如“SqlServer”
公共字符串GetValuesSqlStatement(列出参数值)
{
//…此处使用DatabaseType、SqlPattern和paramValues实现所需的逻辑
}
现在,因为这必须生成一个可执行的SQL语句,所以我不能在执行查询时使用参数。我必须实现的接口是不可协商的。确保数据库查询引擎正确解释结果中的日期的最佳方法是什么?假设paramValues包含.NET DateTime对象,在插入SQL模式字符串之前,应如何将这些对象格式化为字符串?数据库中最常见的通用日期格式是什么?(例如,类似“dd-mmm-yyyy”的词)


注意:从2005年起,我只需要担心Sql Server和Oracle 10g。因此,SQL必须是有效的T SQL和PL SQL,并且在这两种风格中的含义相同。

如果对任何DB使用日期格式“yyy-mm-dd”,则应该可以。这符合ISO 8601()

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

Oracle使用日期“YYYY-MM-DD”表示法:

虽然在某些情况下可能有一种表示法可以同时适用于这两种情况,但我怀疑是否有一种表示法可以同时适用于所有可能的区域服务器设置


正如您所说,YYYY-MON-DD可能很有用-这是Oracle的默认设置。

我提供了我自己的答案,尽管它偏离了问题的范围,因为它可能对其他有类似问题的人是一个有用的建议

我刚刚意识到,我可以简单地期望每个实例(或世界不同地区的每个客户)在参数placeholder的后面部分选择性地指定一个格式字符串。例如,执行:

public string SqlPattern { get {
    return "SELECT name FROM someTable WHERE startDate < {0:yyyy-mm-dd}";
} }  
公共字符串SqlPattern{get{
返回“从startDate<{0:yyyy-mm-dd}的某个表中选择名称”;
} }  

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

在SQL Server中,问题仍然存在(连接),我认为这将是您可以得到的最通用的方法。你知道你的服务器在世界各地的本地化情况吗。好的,这个特定项目将是+8GMT或+9.30GMT,但不能让它突然不为其他客户工作。@mwan我认为所有服务器都应该在美国的一个真正的上帝赋予不变的文化中设置,所有日期都以YYYY-MM-DD格式,所有数字都以999999.99格式,并以GMT格式放置。但我不明白我的方式,因此,我必须注意出现的支持波兰9 999,99表号码的荷兰服务器我有DatabaseType字符串来帮助我构建这个查询。如果您说“yyyy-mm-dd”适用于除SQL Server之外的所有服务器,那么我可以使用条件逻辑。如果“yyyy-mon-dd”在SQL Server和Oracle中都能工作,那当然可以满足我的需要,但我想这不一定是最佳做法。@Lisa,你必须进行实验。我从来没有法语服务器,我总是使用YYYY-MM-DD。你会在Aaron的文章和那个连接项中看到,它不适用于新的date和datetime2数据类型。在SQL Server中。根据我在Oracle的经验,文本总是需要日期限定符来区分它们与字符串。您可能需要将日期字符串生成封装在特定于DB的内容中。我突然有了一个更好的主意,这使得这个问题没有那么有用。我可能会把它作为第三个答案,即使它不是严格地回答这个问题。