在公司学到的知识(5)——DATEADD&DATEDIFF

DECLARE @d date='2012-12-25';

DECLARE @w1 date, @w2 date;
SELECT @w1 = DATEADD(WK,DATEDIFF(WK,0,@d),0);
SELECT @w2 = DATEADD(D, 6, @w1);

DECLARE @m1 date, @m2 date;
SELECT @m1 = DATEADD(M,DATEDIFF(M,0,@w2),0)
SELECT @m2 = DATEADD(MS,-3,DATEADD(M,DATEDIFF(M,0,@w2)+1,0))

DECLARE @m_1 date, @m_2 date;
SELECT @m_1 = DATEADD(M, -1, @m1);
SELECT @m_2 = DATEADD(D, -1, @m1);

 

打出来的结果是这样的:

2012-12-24(星期一)
2012-12-30(星期天)
2012-12-01(本月第一天)
2012-12-31(本月最后一天)
2012-11-01(上月第一天)
2012-11-30(上月最后一天)

官方定义先摆上来先:

DATEADD (datepart , number , date )

datepart——Is the part of date to which an integernumber is added

number——Is an expression that can be resolved to an int that is added to a datepart of date

date——Is an expression that can be resolved to a time, date, smalldatetime, datetime, datetime2, or datetimeoffset value

 

DATEDIFF ( datepart , startdate , enddate )

datepart——Is the part of startdate and enddate that specifies the type of boundary crossed

startdate——Is an expression that can be resolved to a time, date, smalldatetime, datetime, datetime2, or datetimeoffset value.

enddate——See startdate.

DATE数据类型的 一直用得不擅长 所以 DATEADD一上来发现很多不懂的 就比如date的传参 官方给出的定义让我一直觉得应该是TIME或者DATE相关类型的 但是如上述的 跑出了0 而且是多次 不解第一点

不解第二点的是 @m2 的-3 在毫秒(MS)类型下 就是减去3毫秒 依旧无解……

 

----------------------------------------------------------偶是分割线 以下是百度解惑---------------------------------------------------------

首先是官网的关于DATEDIFF部分默认值的解释:

If only a time value is assigned to a variable of a date data type, the value of the missing date part is set to the default value: 1900-01-01. If only a date value is assigned to a variable of a time or date data type, the value of the missing time part is set to the default value: 00:00:00. If either startdate or enddate have only a time part and the other only a date part, the missing time and date parts are set to the default values.

 

文章一开始的时间计算 其实用到的技巧就是根据datepart指定的时间间隔计算与'1900-01-01’的差 然后把差加回'1900-01-01’获得所指定的特殊日期

第一个疑惑解决

 

第二个 关于-3毫秒的

“有一点要记住,在Sql Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。

Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

计算出来的日期的时间部分包含了一个Sql Server可以记录的一天的最后时刻(“23:59:59:997”)的时间。”

这是在网上随处可搜出的一段

 

于是我弄了各种版本进行对比

SELECT DATEADD(MS,-3,DATEADD(M,DATEDIFF(M,0,GETDATE()), 0))——2012-11-30 23:59:59.997
SELECT DATEADD(MS,-2,DATEADD(M,DATEDIFF(M,0,GETDATE()), 0))——2012-11-30 23:59:59.997
SELECT DATEADD(MS,-1,DATEADD(M,DATEDIFF(M,0,GETDATE()), 0))——2012-12-01 00:00:00.000
SELECT DATEADD(MS,0,DATEADD(M,DATEDIFF(M,0,GETDATE()), 0))——2012-12-01 00:00:00.000
SELECT DATEADD(MS,0,'2012-11-30 23:59:59.997')——2012-11-30 23:59:59.997
SELECT DATEADD(MS,0,'2012-11-30 23:59:59.998')——2012-11-30 23:59:59.997
SELECT DATEADD(MS,0,'2012-11-30 23:59:59.999')——2012-12-01 00:00:00.000

我表示 不知道应该如何解释……因为 3毫秒的精确度 大熊有说 这个估计是关乎数据库原理的 表示没有接触过 不知道捏……

看数据 感觉的确是与这3毫秒多少有些关系(-2的时候和-3的时候 结果集没差)只是 现在暂时无法解释 嗯 留待解决 求大神……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值