SQL公用方法-根据日期格式字符串返回年季度开始和结束日期

以下是我本人写的,可能繁杂代码比较多,大家将就看吧。我们一起提高:

IF EXISTS ( SELECT 1 FROM sys.objects o WHERE object_id = object_id( N'[FC1GetStimeEtimeByQQ]' ) AND OBJECTPROPERTY( object_id, N'IsFuntion') = 1 )
DROP function [FC1GetStimeEtimeByQQ]
GO
alter function FC1GetStimeEtimeByQQ
(
@syear nvarchar(5)
,@eyear nvarchar(5)
,@sqq nvarchar(2)
,@eqq nvarchar(1)
)
/*
功能:由季转换成该季度的开始日期结束日期
参数:
返回:开始和结束日期
编写:ljr 
测试:
修改说明:
*/
returns @tb table( stime datetime,etime datetime)
as
begin
declare @stime datetime
declare @etime datetime
set @stime = DATEADD(qq, DATEDIFF(qq,0,@syear+'-01-01'), 0)       
    set @etime = CASE WHEN @eqq=1 THEN DATEADD(D,-1,@eyear+'-04-01 23:59:59.997')
WHEN @eqq=2  THEN DATEADD(D,-1,@eyear+'-07-01 23:59:59.997')
WHEN @eqq=3  THEN DATEADD(D,-1,@eyear+'-10-01 23:59:59.997')
WHEN @eqq=4  THEN DATEADD(D,-1,(cast (@eyear as int)+1)+'-01-01 23:59:59.997')
        END 
    insert @tb select @stime ,@etime
    return
end
go



以下是公司大神写的,果然比我写的好很多,而且考虑的也比较全面。看来还需要认真学习啊。特别是大神的思维方式:

ALTER FUNCTION [dbo].[F0_GetDateTimeByString]
(
@Type INT, --0:年 1:季 2:月
@Str VARCHAR(6), --字符串
@IsEndDate BIT=0 --是否结束日期 0:开始日期 1:结束日期
)
/*
功能:根据传入的字符串返回日期
*/
RETURNS DATETIME 
AS
BEGIN
   DECLARE @DT DATETIME, @Month VARCHAR(2)
  
   IF @Type=0 --年度
   BEGIN
      IF @IsEndDate=1
         SET @DT=CAST(LEFT(@Str, 4)+'-12-31' AS DATETIME)
      ELSE      
         SET @DT=CAST(LEFT(@Str, 4)+'-01-01' AS DATETIME)
   END ELSE
   IF @Type=1 --季度
   BEGIN
      IF @IsEndDate=1
      BEGIN
         SET @Month=RIGHT(CAST(100+CAST(RIGHT(@Str, 1) AS INT)*3 AS VARCHAR), 2)
         SET @DT=CAST(LEFT(@Str, 4)+'-'+@Month+'-'+'01' AS DATETIME)      
      END ELSE
      BEGIN
         SET @Month=RIGHT(CAST(100+CAST(RIGHT(@Str, 1) AS INT)*3-3+1 AS VARCHAR), 2)
         SET @DT=CAST(LEFT(@Str, 4)+'-'+@Month+'-'+'01' AS DATETIME)
      END   
   END ELSE   
   IF @Type=2 --月度
   BEGIN
      IF @IsEndDate=1
      BEGIN   
         SET @Month=RIGHT(CAST(100+CAST(RIGHT(@Str, LEN(@Str)-4) AS INT) AS VARCHAR), 2)
         SET @DT=CAST(LEFT(@Str, 4)+'-'+@Month+'-'+'01' AS DATETIME)
      END ELSE
      BEGIN   
         SET @Month=RIGHT(CAST(100+CAST(RIGHT(@Str, LEN(@Str)-4) AS INT) AS VARCHAR), 2)
         SET @DT=CAST(LEFT(@Str, 4)+'-'+@Month+'-'+'01' AS DATETIME)
      END
   END    
   
   IF @IsEndDate=1
      SET @DT = DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, @DT)+1, 0))  
     
   RETURN @DT
END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值