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的时候 结果集没差)只是 现在暂时无法解释 嗯 留待解决 求大神……