【问题标题】:What is the best practice to query dates in SQL when parameterised queries are not possible当无法进行参数化查询时,在 SQL 中查询日期的最佳做法是什么
【发布时间】:2011-11-23 08:05:43
【问题描述】:

我的简介是实现一个接口,该接口的方法类似于下面的“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
}

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

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

【问题讨论】:

    标签: .net sql date-formatting querying


    【解决方案1】:

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

    Oracle 使用 DATE 'YYYY-MM-DD' 表示法:

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

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

    就像你说的,YYYY-MON-DD 可能有用 - 这是 Oracle 的默认设置。

    【讨论】:

    • 我有 DatabaseType 字符串来帮助我构建这个查询。如果您说“yyyy-mm-dd”适用于除 SQL Server 之外的所有服务器,那么我可以使用条件逻辑。如果 'yyyy-mon-dd' 在 SQL Server 和 Oracle 中都有效,那当然可以满足我的需求,但我猜这不一定是最佳实践。
    • @Lisa,你必须尝试一下。我从来没有法国服务器,我总是使用 YYYY-MM-DD。您将在 Aaron 的文章中看到它不适用于新的 date 和 datetime2 数据类型的连接项。在 SQL Server 中。根据我在 Oracle 中的经验,文字总是需要 DATE 限定符来将它们与字符串区分开来。您可能需要将日期字符串生成包装在特定于 DB 的内容中。
    • 我突然有了一个更好的主意,这让这个问题变得不那么有用了。即使它没有严格回答问题,我也可能会将其添加为第三个答案。
    【解决方案2】:

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

    【讨论】:

    • 我认为这将是你能得到的最通用的。你知道你的服务器的本地化吗?
    • 全世界。好的,这个特定项目将是 +8GMT 或 +9.30GMT,但不能承受它突然不能为不同的客户工作。
    • @mwan 我认为所有服务器都应该设置在美国真正的上帝赐予不变的文化中,所有日期格式为 YYYY-MM-DD,所有数字格式为 9,999,999.99 并放置在格林威治标准时间。但我不明白,所以我必须留意荷兰服务器弹出支持波兰数字 9 999,99 的形式。 ;-)
    【解决方案3】:

    我正在提供我自己的答案,即使它偏离了问题的范围,因为它可能对其他有类似问题的人有用。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多