sql日期处理

本文介绍SQL中日期格式的多种转换方法,包括短日期、长日期、完整日期+时间等格式,并提供了日期推算处理技巧,如计算指定日期的周、月、季度等的起始与结束日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DECLARE @dt datetime
SET @dt=GETDATE()

--1.短日期格式:yyyy-m-d
SELECT REPLACE(CONVERT(varchar(10),@dt,120),N'-0','-')

--2.长日期格式:yyyy年mm月dd日
--A. 方法1
SELECT STUFF(STUFF(CONVERT(char(8),@dt,112),5,0,N'年'),8,0,N'月')+N'日'
--B. 方法2
SELECT DATENAME(Year,@dt)+N'年'+DATENAME(Month,@dt)+N'月'+DATENAME(Day,@dt)+N'日'

--3.长日期格式:yyyy年m月d日
SELECT DATENAME(Year,@dt)+N'年'+CAST(DATEPART(Month,@dt) AS varchar)+N'月'+DATENAME(Day,@dt)+N'日'

--4.完整日期+时间格式:yyyy-mm-dd hh:mi:ss:mmm
SELECT CONVERT(char(11),@dt,120)+CONVERT(char(12),@dt,114)



2、日期推算处理

DECLARE @dt datetime
SET @dt=GETDATE()

DECLARE @number int
SET @number=3

--1.指定日期该年的第一天或最后一天
--A. 年的第一天
SELECT CONVERT(char(5),@dt,120)+'1-1'

--B. 年的最后一天
SELECT CONVERT(char(5),@dt,120)+'12-31'


--2.指定日期所在季度的第一天或最后一天
--A. 季度的第一天
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt)-2,
@dt),
120)+'1')

--B. 季度的最后一天(CASE判断法)
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt),
@dt),
120)
+CASE WHEN DATEPART(Quarter,@dt) in(1,4)
THEN '31'ELSE '30' END)

--C. 季度的最后一天(直接推算法)
SELECT DATEADD(Day,-1,
CONVERT(char(8),
DATEADD(Month,
1+DATEPART(Quarter,@dt)*3-Month(@dt),
@dt),
120)+'1')


--3.指定日期所在月份的第一天或最后一天
--A. 月的第一天
SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')

--B. 月的最后一天
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')

--C. 月的最后一天(容易使用的错误方法)
SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))


--4.指定日期所在周的任意一天
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)


--5.指定日期所在周的任意星期几
--A. 星期天做为一周的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)

--B. 星期一做为一周的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)

SELECT 
/* 
* 输出格式: x年x周
* 如:200621
*/


Convert(varchar(4),intYear) +           /* 先将intYear列转成字符型 */
case when len(intWeek)=1               /* 判断intWeek列的长度是否为1 */
 
then 
  
'0' + Convert(varchar(1),intWeek)   /* intWeek列为1位数字时转化成两位字符,最前面补0 */
  
else 
  
Convert(varchar(2),intWeek)           /* 如果是两位则直接转成字符 */
end 
as allYearWeek,                                  /* 给列取别名allYearWeek */

/* 
* 输出格式: xxxx年xx周
* 如:2006年21周
*/

Convert(varchar(4),intYear) + '' +
case when len(intWeek)=1
 
then
  
'0'+ Convert(varchar(1),intWeek) 
 
else
  
Convert(varchar(2),intWeek) 
end
 
+ '' as DesYearWeek ,

/* 
* 输出格式:x月x日~x月x日
* 如: 05.22~05.28
 
*/

right(replace(strWeekBeginDate,'-','.'),5+   /* 先把替换为".",然后再取右边5位 */
'' + 
right(replace(strWeekEndDate,'-','.'),5)
as DesDate

FROM V_GetAllWeeks order by intYear Desc, intWeek Desc

输出结果:

allYearWeek      DesYearWeek               DesDate
200621                2006年21周                  05.2205.28
200620                2006年20周                  05.1505.21
200619                2006年19周                  05.0805.14
200618                2006年18周                  05.0105.07
200617                2006年17周                  04.2404.30
200616                2006年16周                  04.1704.23
200615                2006年15周                  04.1004.16
200614                2006年14周                  04.0304.09
200613                2006年13周                  03.2704.02
200612                2006年12周                  03.2003.26
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值