--
计算给定日期所在月的天数
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
--
本月度第一天与下月度第一天所差的天数
SELECT
DATEDIFF
(
DAY
,
DATEADD
(
MONTH
,
DATEDIFF
(
MONTH
,
0
,
@Date
),
0
),
DATEADD
(
MONTH
,
1
+
DATEDIFF
(
MONTH
,
0
,
@Date
),
0
))
--
借助变量简化
SELECT
@Date
=
DATEADD
(
MONTH
,
DATEDIFF
(
MONTH
,
0
,
@Date
),
0
)
--
本月度第一天
SELECT
DATEDIFF
(
DAY
,
@Date
,
DATEADD
(
MONTH
,
1
,
@Date
))
--
另一种思路:给定月最后一天的日期,记为本月天数
SELECT
DAY
(
DATEADD
(
MONTH
,
DATEDIFF
(
MONTH
,
-
1
,
@Date
),
-
1
))
GO
--
计算给定日期所在季度的天数
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
--
本季度第一天与下季度第一天所差的天数
SELECT
DATEDIFF
(
DAY
,
DATEADD
(QUARTER,
DATEDIFF
(QUARTER,
0
,
@Date
),
0
),
DATEADD
(QUARTER,
1
+
DATEDIFF
(QUARTER,
0
,
@Date
),
0
))
--
借助变量简化
SELECT
@Date
=
DATEADD
(QUARTER,
DATEDIFF
(QUARTER,
0
,
@Date
),
0
)
--
本季度第一天
SELECT
DATEDIFF
(
DAY
,
@Date
,
DATEADD
(QUARTER,
1
,
@Date
))
GO
--
计算给定日期所在年度的天数
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
--
本年度第一天与下年度第一天所差的天数
SELECT
DATEDIFF
(
DAY
,
DATEADD
(
YEAR
,
DATEDIFF
(
YEAR
,
0
,
@Date
),
0
),
DATEADD
(
YEAR
,
1
+
DATEDIFF
(
YEAR
,
0
,
@Date
),
0
))
--
借助变量简化
SELECT
@Date
=
DATEADD
(
YEAR
,
DATEDIFF
(
YEAR
,
0
,
@Date
),
0
)
--
本年度第一天
SELECT
DATEDIFF
(
DAY
,
@Date
,
DATEADD
(
YEAR
,
1
,
@Date
))
GO
--
判断给定日期所在年是否闰年
--
根据全年总天数判断
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
SELECT
CASE
DATEDIFF
(
DAY
,
DATEADD
(
YEAR
,
DATEDIFF
(
YEAR
,
0
,
@Date
),
0
),
DATEADD
(
YEAR
,
1
+
DATEDIFF
(
YEAR
,
0
,
@Date
),
0
))
WHEN
365
THEN
'
平年
'
ELSE
'
闰年
'
END
--
根据二月天数判断
--
给日期的上一年最后一天加2个月,即为当年2月最后一天
SELECT
CASE
DAY
(
DATEADD
(
MONTH
,
2
,
DATEADD
(
YEAR
,
DATEDIFF
(
YEAR
,
0
,
@Date
),
-
1
)))
WHEN
28
THEN
'
平年
'
ELSE
'
闰年
'
END
GO
--
计算给定日期是当年的第几天
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
SELECT
DATEPART
(DAYOFYEAR,
@Date
)
[
DayOfYear
]
;
SELECT
DATENAME
(DAYOFYEAR,
@Date
)
[
DayOfYear
]
;
--
另一种思路:当前日期与上年最后一天差的天数
SELECT
DATEDIFF
(
DAY
,
DATEADD
(
YEAR
,
DATEDIFF
(
YEAR
,
0
,
@Date
),
-
1
),
@Date
)
[
DayOfYear
]
GO
--
计算给定日期是当年的第几周
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
SELECT
DATEPART
(WEEK,
@Date
)
[
WeekOfYear
]
;
--
返回int型
SELECT
DATENAME
(WEEK,
@Date
)
[
WeekOfYear
]
;
--
返回varchar型
GO
--
计算给定日期是当年的第几月
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
SELECT
DATEPART
(
MONTH
,
@Date
)
[
MonthOfYear
]
;
--
返回int型
SELECT
DATENAME
(
MONTH
,
@Date
)
[
MonthOfYear
]
;
--
返回varchar型
SELECT
MONTH
(
@Date
)
[
MonthOfYear
]
;
--
返回int型
GO
--
计算给定日期是当年的第几季度
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
SELECT
DATEPART
(QUARTER,
@Date
)
[
QuarterOfYear
]
;
--
返回int型
SELECT
DATENAME
(QUARTER,
@Date
)
[
QuarterOfYear
]
;
--
返回varchar型
GO
--
计算给定日期是当月的第几周
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
--
思路,给定日期是当年的第几周-给定日期所在月第一天是当年的第几周
SELECT
DATEPART
(WEEK,
@Date
)
-
DATEPART
(WEEK,
DATEADD
(
MONTH
,
DATEDIFF
(
MONTH
,
0
,
@Date
),
0
))
+
1
[
WeekOfMonth
]
SELECT
DATEPART
(WEEK,
@Date
)
-
DATEPART
(WEEK,
DATEADD
(
DAY
,
1
-
DATEPART
(
DAY
,
@Date
),
@Date
))
+
1
[
WeekOfMonth
]
GO
--
计算给定日期所在月的第一个星期一是哪天
DECLARE
@Date
DATETIME
;
SET
@Date
=
GETDATE
()
--
思路,1900-01-01(星期一)加上(给定日志所在月的月6号与1900-01-01差的周数)个周
--
为什么不选7号?如果是7号,那么7好恰好是星期日的话,第一个周一就会算到8号。
--
为什么不选5号?如果5号是星期六,那么周一就跑到上月了。小于5号与这个道理一样。
SELECT
DATEADD
(WEEK,
DATEDIFF
(WEEK,
0
,
DATEADD
(
DAY
,
6
-
DATEPART
(
DAY
,
@Date
),
@Date
)),
0
)
'
所在月的第一个星期一
'
SELECT
DATEADD
(WEEK,
DATEDIFF
(WEEK,
0
,
DATEADD
(
DAY
,
6
-
DATEPART
(
DAY
,
@Date
),
@Date
)),
7
)
'
所在月的第二个星期一
'
SELECT
DATEADD
(WEEK,
DATEDIFF
(WEEK,
0
,
DATEADD
(
DAY
,
6
-
DATEPART
(
DAY
,
@Date
),
@Date
)),
1
)
'
所在月的第一个星期二
'
SELECT
DATEADD
(WEEK,
DATEDIFF
(WEEK,
0
,
DATEADD
(
DAY
,
6
-
DATEPART
(
DAY
,
@Date
),
@Date
)),
8
)
'
所在月的第二个星期二
'
GO