SQL Server和date + 1的结果



对于SQL Server。比如说,如果我有一个包含[myDate]列的表,它的类型是datetime,那么在下面的上下文中给它加1意味着什么?

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

加一天(正好24小时)

然而,这样你的查询更正确。如果存在

列,则该列上的函数或处理通常会使索引使用无效。
WHERE [myDate] > @someDate - 1

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

使用 DATEADD 函数(详细信息请参阅MSDN文档中的DATEADD):

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

DATEADD允许您添加任何通常的日期部分(日,月,年)和时间部分(小时,分钟,秒)等。

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

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

DateAdd更安全,因为它对底层实现没有任何假设。

会加一天。这利用了SQL Server将日期存储为两个整数的事实,一个表示从"0"开始的天数-(1900年1月1日),第二个表示从午夜(时间)开始的刻度数(约3.33 ms) *。

让你的查询使用索引…首先在输入过滤参数上使用这个公式,或者在表日期时间字段中等号的"另一边"使用这个公式,这样查询优化器就不必在表中的每个datetime字段上运行计算来确定哪些行满足过滤器谓词。这使得你的搜索参数"SARG-able"(搜索参数)

 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

简单地在DATE类型中添加数字是行不通的。

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

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

在更新可能将日期类型映射为DATETIME(因为SQL2005中只有DATETIME)的数据库驱动程序时,这可能是一个问题,但是更改为使用date .

应该在日期上加1天(24小时),加0.5将有半天(12小时),加2将增加天(48小时),等等。但是@Barry在他的评论中说得很好。你可以试试看看。

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

相关内容

  • 没有找到相关文章

最新更新