sql日期处理

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.22 05.28
200620                 2006年20周                   05.15 05.21
200619                 2006年19周                   05.08 05.14
200618                 2006年18周                   05.01 05.07
200617                 2006年17周                   04.24 04.30
200616                 2006年16周                   04.17 04.23
200615                 2006年15周                   04.10 04.16
200614                 2006年14周                   04.03 04.09
200613                 2006年13周                   03.27 04.02
200612                 2006年12周                   03.20 03.26 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值