【问题标题】:SQL Server and date + 1 resultSQL Server 和日期 + 1 个结果
【发布时间】:2011-07-16 19:34:32
【问题描述】:

如果是 SQL Server。比如说,如果我有一个包含 [myDate] 列的表,它的类型是日期时间,那么在以下上下文中添加 1 意味着什么?

SELECT * 
  FROM [myTable] 
 WHERE [myDate] + 1 > @someDate

【问题讨论】:

  • 你为什么不试试看呢?
  • 请非常小心使用这样的速记符号而不是正确的 DATEADD() 语句。虽然很难键入,但 DATEADD() 更容易阅读,但更重要的是,它将与 SQL Server 2008 中的新日期/时间类型不同。尝试将 1 添加到 DATE 例如:Msg 206, Level 16, State 2、第 3 行 - 操作数类型冲突:日期与 int 不兼容

标签: sql sql-server datetime


【解决方案1】:

它增加了一天(正好是 24 小时)

但是,您的查询以这种方式更正确。如果存在该列之一,则该列上的函数或处理通常会使索引使用无效

WHERE [myDate] > @someDate - 1

WHERE [myDate] > DATEADD(day, -1, @someDate)

【讨论】:

  • @marc_s:是的,自 1900 年以来的整个天数 + 小数时间都依赖于内部存储。删除我们使用 0 而不是 1900 年 1 月 1 日的时间的 DATEADD/DATEDIFF 技巧没有什么不同
  • 这是关于使索引使用无效的一个有趣点。我一般的开发人员在编写查询时不会考虑这一点。
  • @Adam Porad:前 10 个 SQL 错误中的第 2 位:simple-talk.com/sql/t-sql-programming/…
  • ..“通常”使索引使用无效... ??它总是使索引使用无效
  • @gbn:很棒的链接!谢谢。几乎和 Brent Ozar 的 Top Ten Developer's Mistakes That Won't Scale 一样好 :-)
【解决方案2】:

使用DATEADD函数(详见MSDN docs for DATEADD):

SELECT * 
  FROM dbo.myTable
 WHERE DATEADD(D, 1, myDate) > @someDate

DATEADD 允许您添加任何常用的日期部分(日、月、年)以及时间部分(小时、分钟、秒)等。

【讨论】:

  • 那么,和加一天一样吗? wring + 1 真的会更快吗?
  • @ahmd0:我不认为其中一个会以任何显着的方式更快或更慢 - 或者您真的需要进行亚纳秒优化吗? !?!??
  • @ahmd0:这两种方法都会比someDate - 1
【解决方案3】:

DATETIME 可以表示为十进制值。整数部分表示日期,小数部分表示时间。

所以 [DATETIME] + 1 表示“第二天的同一时间”。

DateAdd 更安全,因为它不假设底层实现。

【讨论】:

  • 哦,所以加1.5会加1天12小时?关于 DateAdd,我正在寻找最快的实现。
  • @ahmd0:我不会过多地依赖任何东西的内部结构 - 使用记录在案的、受支持的 API - DATEADD 函数 - 更安全!内部可能会突然改变......
  • 是的。如果您需要尽力而为,请随意。但是记录下来,这样你(或下一个维护它的人)就不必回来问同样的问题了! ;-)
  • DateAdd 非常快...请参阅下面的答案。
【解决方案4】:

它会增加一天。这利用了 SQL Server 将日期存储为两个整数这一事实的优势,一个表示自第“0”天 - (1900 年 1 月 1 日)以来的天数,第二个表示自午夜以来的滴答数(约 3.33 毫秒) (当时)*。

要使您的查询使用索引...首先在输入过滤参数上使用此公式,或者在表日期时间字段的等号的“另一”侧使用此公式,以便查询优化器不必对表中的每个日期时间字段运行计算以确定哪些行满足过滤谓词。这使您的搜索参数“支持 SARG”(搜索参数)

 Where MyDateTimeColumn > DateAdd(day,       
         datediff(day,0, @MydateParameter), 0)    -- SARG-able

而不是

 Where DateAdd(day, datediff(day,0,       
   MyDateTimeColumn ), 0) > MydateParameter -- Not SARG-able •

在你的情况下,这意味着使用

   Select *
   FROM [myTable]  
   WHERE [myDate]  > @someDate - 1  

而不是

   Select *
   FROM [myTable]  
   WHERE [myDate] + 1  > @someDate   

注意。在内部,第二个整数(时间部分)存储刻度。一天中有 24 x 60 X 60 X 300 = 25,920,000 个滴答声(偶然地刚好低于 32 位整数可以容纳的最大值)。但是,在对日期时间进行算术修改时,您无需担心这一点......当从日期时间中添加或减去值时,您可以将该值视为一个分数,就好像它完全等于一天的小数部分一样,就好像完整的日期时间值是一个浮点数,由表示日期的整数部分和表示时间的小数部分组成)。即,

  Declare @Dt DateTime Set @Dt = getdate()
  Set @Dt = @Dt + 1.0/24 -- Adds one hour
  Select @Dt
  Set @Dt = @Dt - .25 -- Moves back 6 hours
  Select @Dt

【讨论】:

    【解决方案5】:

    仅向 DATE 类型添加数字是行不通的。

    这行得通:

    SELECT CAST('2014-11-21 14:30' AS DATETIME) + 1
    

    这不是:

    SELECT CAST('2014-11-21 14:30' AS DATE) + 1
    

    当更新可能将日期类型映射到 DATETIME 的数据库驱动程序时,这可能会出现问题(因为这就是 SQL2005 中的全部内容),但改为使用 DATE。

    【讨论】:

      【解决方案6】:

      它应该在日期上增加 1 天(24 小时),增加 0.5 将有半天(12 小时),增加 2 将增加天数(48 小时),等等。但@Barry 在他的评论中提出了一个很好的观点.你可以试试看。

      如果您想添加其他分钟、秒、毫秒等。您应该使用 SQL Server 内置的DATEADD 函数。

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        相关资源
        最近更新 更多