常用日期
以下getdate()取’2023–03-15’
一年中的第一天
SELECT CONVERT(CHAR(5),GETDATE(),120)+'01-01'
SELECT DATEADD(YY,DATEDIFF(YY,0,GETDATE()),0)
- 其中char(5)是为了取日期的前五个字符。
- getdate()是获取当前日期。根据情况可以换成其它日期
- convert是将日期型转化为字符型
eg:
SELECT CONVERT(CHAR(5),'2023-03-21',120)+'01-01'
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
2023-01-01
2023-01-01
年的最后一天
SELECT CONVERT(CHAR(5),GETDATE(),120)+'12-31'
SELECT dateadd(day, -1, dateadd(month, 1,convert(varchar(4),datepart(year, getdate())) + '-12-01'))
2023-12-31
2023-12-31
指定季度的第一天
--方法一
SELECT CONVERT(DATETIME,
CONVERT(CHAR(8),
DATEADD(Month,
DATEPART(Quarter,GETDATE())*3-Month(GETDATE())-2,
GETDATE()),
120)+'1')
--方法二
SELECT CASE WHEN DATEPART(QUARTER,GETDATE())=1 THEN CONVERTpqewriung(DATETIME,CAST(YEAR(GETDATE()) AS VARCHAR(10))+'-01-01')
WHEN DATEPART(QUARTER,GETDATE())=2 THEN CONVERT(DATETIME,CAST(YEAR(GETDATE()) AS VARCHAR(10)) +'-04-01')
WHEN DATEPART(QUARTER,GETDATE())=3 THEN CONVERT(DATETIME,CAST(YEAR(GETDATE()) AS VARCHAR(10))+'-07-01')
WHEN DATEPART(QUARTER,GETDATE())=4 THEN CONVERT(DATETIME,CAST(YEAR(GETDATE()) AS VARCHAR(10))+'-10-01')
ELSE NULL end
2023-01-01
2023-01-01
- 第二个方法采用的是case when … then 条件判断得到的当前季度的第一天日期。
- DATEPART是返回指定日期的指定类型的函数,返回的是int型。而datename返回的是字符型。
指定季度的第一天
--第一种方法
SELECT DATEADD(Day,-1,
CONVERT(CHAR(8),
DATEADD(Month,
1+DATEPART(Quarter,GETDATE())*3-Month(GETDATE()),
GETDATE()),
120)+'1')
--第二种方法
SELECT CONVERT(DATETIME,
CONVERT(CHAR(8),
DATEADD(Month,
DATEPART(Quarter,GETDATE())*3-Month(GETDATE()),
GETDATE()),
120)
+CASE WHEN DATEPART(Quarter,GETDATE()) in(1,4)
THEN '31'ELSE '30' END)
2023-3-31
2023-3-31
- 由于每个月的天数不一样,需要对季度进行判断。在第一季度和第四季度时有31天,第二季度和第三季度是30天。
指定日期月的第一天
SELECT CONVERT(DATETIME,CONVERT(CHAR(8),GETDATE(),120)+'01')
SELECT DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)
2023-03-01 00:00:00.000
指定日期月的最后一天
SELECT DATEADD(Day,-1,CONVERT(CHAR(8),DATEADD(Month,1,GETDATE()),120)+'01')
2023-03-31 00:00:00.000
指定日期的本周第一天
Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
2023-03-13 00:00:00.000
指定日期的本周最后一天
SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),6)
2023-03-19 00:00:00.000
封装成函数
CREATE FUNCTION trandate --
--SELECT dbo.trandate ('2023-03-15','M',1)
(@yourdate DATETIME,
@type VARCHAR(7),
@daytype INT --1表示月、季度、年、周的第一天,2表示月、季度、年、周的最后一天,
)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @Result SMALLDATETIME;
-- 年的第一天
SELECT @Result= DATEADD(YY,DATEDIFF(YY,0,@yourdate),0) WHERE @type='Y' AND @DAYTYPE=1
-- 年的最后一天
SELECT @Result=CONVERT(CHAR(5),@yourdate,120)+'12-31' WHERE @type='Y' AND @DAYTYPE=2
--季度的第一天
SELECT @Result=CONVERT(DATETIME,
CONVERT(CHAR(8),
DATEADD(MONTH,
DATEPART(QUARTER,@yourdate)*3-MONTH(@yourdate)-2,
@yourdate),
120)+'1')
WHERE @type='Q' AND @DAYTYPE=1
--季度的最后一天
SELECT @Result=CONVERT(DATETIME,
CONVERT(CHAR(8),
DATEADD(MONTH,
DATEPART(QUARTER,@yourdate)*3-MONTH(@yourdate),
@yourdate),
120)
+CASE WHEN DATEPART(QUARTER,@yourdate) IN(1,4)
THEN '31'ELSE '30' END)
WHERE @type='Q' AND @DAYTYPE=2
--月的第一天
SELECT @Result=DATEADD(MM,DATEDIFF(MM,0,@yourdate),0) WHERE @type='M' AND @DAYTYPE=1
--月的最后一天
SELECT @Result=DATEADD(DAY,-1,CONVERT(CHAR(8),DATEADD(MONTH,1,@yourdate),120)+'01') WHERE @type='M' AND @DAYTYPE=2
--本周的第一天
SELECT @Result=DATEADD(wk, DATEDIFF(wk,0,@yourdate), 0) WHERE @type='W' AND @DAYTYPE=1
--本周的最后一天
SELECT @Result=DATEADD(wk,DATEDIFF(wk,0,@yourdate),6) WHERE @type='W' AND @DAYTYPE=2
RETURN @Result;
END