【问题标题】:Using Dates in SQL Server 2012 Query在 SQL Server 2012 查询中使用日期
【发布时间】:2014-09-09 12:17:43
【问题描述】:

我正在使用 SQL Server 2012,我需要编写一个查询来提取大于特定日期的数据。日期字段称为“CreatedOn”,日期以“2014-08-18 17:02:57.903”的格式记录。

目前,我查询的日期部分如下:

    WHERE CreatedOn > '2014-08-18'

问题是提取的数据包括“2014-08-18”的数据。这就像 >(大于)的行为就像 >=(大于或等于)!

如果我需要所有数据,比如大于 '2014-08-18',我应该如何编写查询?

【问题讨论】:

    标签: sql sql-server date sql-server-2012


    【解决方案1】:

    尝试以下条件。问题是2014-08-18 真的是2014-08-18 00:00:00(包括小时),所以当天的任何日期时间都会更大。

    WHERE CreatedOn >= '2014-08-19'
    

    【讨论】:

      【解决方案2】:

      “2014-08-18”实际上是指“2014-08-18 00:00:00”

      因此,如果您不想要 18 日,您应该输入“2014-08-19”或指定您希望日期更大的时间。

      【讨论】:

        【解决方案3】:

        正如其他人所说,它实际上正在翻译为CreatedOn > 2014-08-18 00:00:00 而是尝试将您的 datetime 字段转换为 short ate 并进行比较。

        Convert 中的 126 映射到 yyyy-mm-ddThh:mi:ss.mmm format

        WHERE CONVERT(char(10), CreatedOn,126) > '2014-08-18'
        

        【讨论】:

        • CONVERT 的问题在于它使条件不可搜索,这意味着 DBMS 无法使用任何索引来解析查询。
        • 不是这种方法的粉丝,因为您正在对每一行进行转换,而不是一次 - 尽管它确实有效:P
        • 我同意你们两个,但这是一个解决方案!
        【解决方案4】:

        听起来,当您说您想要“大于 '2014-08-18' 的记录时,实际上是指“发生在 2014-08-18 23:59:59.999999 之后的记录” - 您必须考虑使用日期时的时间,除非以其他方式删除时间(在您的示例数据中不是这样。

        您可以执行以下操作:

        declare @gtDate datetime
        set @gtDate = dateadd(d, 1, convert(datetime,convert(varchar(10), '2014-08-18', 101)))
        
        ....
        WHERE CreatedOn >= @gtDate
        

        在这里,我们将您的“2014-08-18”转换为仅包含日期的 varchar(以帮助以防“2014-08-18”曾经是“2014-08-18 12:00”: 00为例)

        然后我们将 varchar 转换回日期,并为其添加一天。最后声明说

        给我 2014 年 8 月 19 日或以后发生的记录

        编辑:

        这是一个小提琴演示

        http://sqlfiddle.com/#!6/90465/1

        请注意,我们有 4 行数据潜力

        insert into sampleData (Created)
        select '2014-08-17'
        union all select '2014-08-18'
        union all select '2014-08-18 12:00:00'
        union all select '2014-08-19'
        union all select '2014-08-19 15:00:00'
        

        仅返回底部 2 行(2014-08-19 和 2014-08-19 15:00:00)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          • 2014-08-29
          • 1970-01-01
          • 1970-01-01
          • 2016-06-17
          相关资源
          最近更新 更多