对于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函数