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

来源:互联网 发布:淘宝打单怎么打 编辑:程序博客网 时间:2024/06/05 09:29

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

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 0
原创粉丝点击