计录,非原创
1.一个月第一天的
Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
2.本周的星期一
Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
3.一年的第一天
Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
4.季度的第一天
Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
5.当天的半夜
Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
6.上个月的最后一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
7.去年的最后一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
8.本月的最后一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
9.本年的最后一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
10.本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)
在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate() 用DateName()就可以获得相应的年、月、日,然后再把它们连接起来就可以了:
Select Datename(year,GetDate())+'-'+Datename (month,GetDate())+'-'+Datename(day,GetDate())
另外,DateName()还可以获得到小时、时间、秒、星期几、第几周,分别如下:
Select Datename(hour,GetDate()) Select Datename(minute,GetDate()) Select Datename(second,GetDate()) Select Datename(weekDay,GetDate()) Select Datename(week,GetDate())
SQL中的日期类型DateTime的默认格式就是yyyy-mm-dd hh:mi:ss: mmm,可大多数的情况我们只想得到他的日期部分,而不许要后面的时间。上一篇中提到用Datename()函数来截取拼接出不包含时间部分的日期,现在再说一种方法,更加简单的获取到不包含时间的日期
Convert函数转换字符串
set nocount on; SELECT 'CONVERT(varchar(100), GETDATE(), 0) 'T_Sql, CONVERT(varchar(100), GETDATE(), 0) ConvertResult --01 16 2021 11:16AM union SELECT 'CONVERT(varchar(100), GETDATE(), 1) ', CONVERT(varchar(100), GETDATE(), 1) --01/16/21 union SELECT 'CONVERT(varchar(100), GETDATE(), 2) ', CONVERT(varchar(100), GETDATE(), 2) --01-16-21 union SELECT 'CONVERT(varchar(100), GETDATE(), 3) ', CONVERT(varchar(100), GETDATE(), 3) --01 16 2021 11:16AM union SELECT 'CONVERT(varchar(100), GETDATE(), 4) ', CONVERT(varchar(100), GETDATE(), 4) --01/16/2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 5) ', CONVERT(varchar(100), GETDATE(), 5) --2021.01.16 union SELECT 'CONVERT(varchar(100), GETDATE(), 6) ', CONVERT(varchar(100), GETDATE(), 6) --16/01/2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 7) ', CONVERT(varchar(100), GETDATE(), 7) --16.01.2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 8) ', CONVERT(varchar(100), GETDATE(), 8) --16-01-2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 9) ', CONVERT(varchar(100), GETDATE(), 9) --16 01 2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 10) ' , CONVERT(varchar(100), GETDATE(), 10) --01 16, 2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 11) ' , CONVERT(varchar(100), GETDATE(), 11) --11:16:27 union SELECT 'CONVERT(varchar(100), GETDATE(), 12) ' , CONVERT(varchar(100), GETDATE(), 12) --01 16 2021 11:16:27:507AM union SELECT 'CONVERT(varchar(100), GETDATE(), 13) ' , CONVERT(varchar(100), GETDATE(), 13) --21/01/16 union SELECT 'CONVERT(varchar(100), GETDATE(), 14) ' , CONVERT(varchar(100), GETDATE(), 14) --01-16-2021 union SELECT 'CONVERT(varchar(100), GETDATE(), 20) ' , CONVERT(varchar(100), GETDATE(), 20) --2021/01/16 union SELECT 'CONVERT(varchar(100), GETDATE(), 21) ' , CONVERT(varchar(100), GETDATE(), 21) --20210116 union SELECT 'CONVERT(varchar(100), GETDATE(), 22) ' , CONVERT(varchar(100), GETDATE(), 22) --16 01 2021 11:16:27:507 union SELECT 'CONVERT(varchar(100), GETDATE(), 23) ' , CONVERT(varchar(100), GETDATE(), 23) --11:16:27:507 union SELECT 'CONVERT(varchar(100), GETDATE(), 24) ' , CONVERT(varchar(100), GETDATE(), 24) --210116 union SELECT 'CONVERT(varchar(100), GETDATE(), 25) ' , CONVERT(varchar(100), GETDATE(), 25) --2021-01-16 11:16:27 union SELECT 'CONVERT(varchar(100), GETDATE(), 100)' , CONVERT(varchar(100), GETDATE(), 100) --2021-01-16 11:16:27.507 union SELECT 'CONVERT(varchar(100), GETDATE(), 101)' , CONVERT(varchar(100), GETDATE(), 101) --2021-01-16T11:16:27.507 union SELECT 'CONVERT(varchar(100), GETDATE(), 102)' , CONVERT(varchar(100), GETDATE(), 102) --16 01 2021 11:16:27:507 union SELECT 'CONVERT(varchar(100), GETDATE(), 103)' , CONVERT(varchar(100), GETDATE(), 103) -- 3 ????? ??????? 1442 11:16:27:507AM union SELECT 'CONVERT(varchar(100), GETDATE(), 104)' , CONVERT(varchar(100), GETDATE(), 104) -- 3/06/1442 11:16:27:507AM union SELECT 'CONVERT(varchar(100), GETDATE(), 105)' , CONVERT(varchar(100), GETDATE(), 105) --11:16:27:507 union SELECT 'CONVERT(varchar(100), GETDATE(), 106)' , CONVERT(varchar(100), GETDATE(), 106) --21.01.16 union SELECT 'CONVERT(varchar(100), GETDATE(), 107)' , CONVERT(varchar(100), GETDATE(), 107) --2021-01-16 11:16:27 union SELECT 'CONVERT(varchar(100), GETDATE(), 108)' , CONVERT(varchar(100), GETDATE(), 108) --2021-01-16 11:16:27.507 union SELECT 'CONVERT(varchar(100), GETDATE(), 109)' , CONVERT(varchar(100), GETDATE(), 109) --01/16/21 11:16:27 AM union SELECT 'CONVERT(varchar(100), GETDATE(), 110)' , CONVERT(varchar(100), GETDATE(), 110) --2021-01-16 union SELECT 'CONVERT(varchar(100), GETDATE(), 111)' , CONVERT(varchar(100), GETDATE(), 111) --11:16:27 union SELECT 'CONVERT(varchar(100), GETDATE(), 112)' , CONVERT(varchar(100), GETDATE(), 112) --2021-01-16 11:16:27.507 union SELECT 'CONVERT(varchar(100), GETDATE(), 113)' , CONVERT(varchar(100), GETDATE(), 113) --16/01/21 union SELECT 'CONVERT(varchar(100), GETDATE(), 114)' , CONVERT(varchar(100), GETDATE(), 114) --16.01.21 union SELECT 'CONVERT(varchar(100), GETDATE(), 120)' , CONVERT(varchar(100), GETDATE(), 120) --16-01-21 union SELECT 'CONVERT(varchar(100), GETDATE(), 121)' , CONVERT(varchar(100), GETDATE(), 121) --16 01 21 union SELECT 'CONVERT(varchar(100), GETDATE(), 126)' , CONVERT(varchar(100), GETDATE(), 126) --01 16, 21 union SELECT 'CONVERT(varchar(100), GETDATE(), 130)' , CONVERT(varchar(100), GETDATE(), 130) --11:16:27 union SELECT 'CONVERT(varchar(100), GETDATE(), 131)' , CONVERT(varchar(100), GETDATE(), 131) --01 16 2021 11:16:27:507AM set nocount off
varchar转换DateTIme回去,根据格式,比如 '01 16 2021 11:16AM'对应 --SELECT 'CONVERT(varchar(100), GETDATE(), 0) 'T_Sql, CONVERT(varchar(100), GETDATE(), 0) ConvertResult --01 16 2021 11:16AM
declare @DateSt varchar(100) = '01 16 2021 11:16AM' declare @Date datetime= CONVERT(datetime,@DateSt,0) select @Date [Date],DATENAME(YY,@Date)Y,DATENAME(MM,@Date)M,DATENAME(DD,@Date)D
--1. Style=101时,表示日期字符串为:mm/dd/yyyy格式 SELECT CONVERT(datetime,'11/1/2003',101) --结果:2003-11-01 00:00:00.000 --2. Style=101时,表示日期字符串为:dd/mm/yyyy格式 SELECT CONVERT(datetime,'11/1/2003',103) --结果:2003-01-11 00:00:00.000 /*== 日期转换为字符串 ==*/ DECLARE @dt datetime SET @dt='2003-1-11' --1. Style=101时,表示将日期转换为:mm/dd/yyyy 格式 SELECT CONVERT(varchar,@dt,101) --结果:01/11/2003 --2. Style=103时,表示将日期转换为:dd/mm/yyyy 格式 SELECT CONVERT(varchar,@dt,103) --结果:11/01/2003 /*== 这是很多人经常犯的错误,对非日期型转换使用日期的style样式 ==*/ SELECT CONVERT(varchar,'2003-1-11',101) --结果:2003-1-11 --1. /*--说明 SET DATEFORMAT设置对使用CONVERT把字符型日期转换为日期的处理也具有影响 但不影响明确指定了style的CONVERT处理。 --*/ --示例 ,在下面的示例中,第一个CONVERT转换未指定style,转换的结果受SET DATAFORMAT的影响,第二个CONVERT转换指定了style,转换结果受style的影响。 --设置输入日期顺序为 日/月/年 SET DATEFORMAT DMY --不指定Style参数的CONVERT转换将受到SET DATEFORMAT的影响 SELECT CONVERT(datetime,'2-1-2005') --结果: 2005-01-02 00:00:00.000 --指定Style参数的CONVERT转换不受SET DATEFORMAT的影响 SELECT CONVERT(datetime,'2-1-2005',101) --结果: 2005-02-01 00:00:00.000 GO --2. /*--说明 --如果输入的日期包含了世纪部分,则对日期进行解释处理时 年份的解释不受SET DATEFORMAT设置的影响。 --*/ --示例,在下面的代码中,同样的SET DATEFORMAT设置,输入日期的世纪部分与不输入日期的世纪部分,解释的日期结果不同。 DECLARE @dt datetime --设置SET DATEFORMAT为:月日年 SET DATEFORMAT MDY --输入的日期中指定世纪部分 SET @dt='01-2002-03' SELECT @dt --结果: 2002-01-03 00:00:00.000 --输入的日期中不指定世纪部分 SET @dt='01-02-03' SELECT @dt --结果: 2003-01-02 00:00:00.000 GO --3. /*--说明 --如果输入的日期不包含日期分隔符,那么SQL Server在对日期进行解释时 将忽略SET DATEFORMAT的设置。 --*/ --示例,在下面的代码中,不包含日期分隔符的字符日期,在不同的SET DATEFORMAT设置下,其解释的结果是一样的。 DECLARE @dt datetime --设置SET DATEFORMAT为:月日年 SET DATEFORMAT MDY SET @dt='010203' SELECT @dt --结果: 2001-02-03 00:00:00.000 --设置SET DATEFORMAT为:日月年 SET DATEFORMAT DMY SET @dt='010203' SELECT @dt --结果: 2001-02-03 00:00:00.000 --输入的日期中包含日期分隔符 SET @dt='01-02-03' SELECT @dt --结果: 2003-02-01 00:00:00.000 --以下示例演示了在不同的语言环境(SET LANGUAGE)下,DATENAME与CONVERT函数的不同结果。 USE master --设置会话的语言环境为: English SET LANGUAGE N'English' SELECT DATENAME(Month,GETDATE()) AS [Month], DATENAME(Weekday,GETDATE()) AS [Weekday], CONVERT(varchar,GETDATE(),109) AS [CONVERT] /*--结果: Month Weekday CONVERT ------------- -------------- ------------------------------- March Tuesday Mar 15 2005 8:59PM --*/ --设置会话的语言环境为: 简体中文 SET LANGUAGE N'简体中文' SELECT DATENAME(Month,GETDATE()) AS [Month], DATENAME(Weekday,GETDATE()) AS [Weekday], CONVERT(varchar,GETDATE(),109) AS [CONVERT] /*--结果 Month Weekday CONVERT