Sqlsever 时间拆分存储过程

博客主要围绕数据库相关操作,介绍了创建自定义的Split表值函数,给出了直接执行示例,还涉及存储过程的创建以及如何执行存储过程,聚焦于数据库编程方面的内容。

创建自定义的Split(表值函数)

CREATE FUNCTION [dbo].[Split](@String    VARCHAR(8000), 
                              @Delimiter CHAR(1)) 
returns @temptable TABLE ( 
  items VARCHAR(8000)) 
AS 
  BEGIN 
      DECLARE @idx INT 
      DECLARE @slice VARCHAR(8000) 

      SELECT @idx = 1 

      IF Len(@String) < 1 
          OR @String IS NULL 
        RETURN 

      WHILE @idx != 0 
        BEGIN 
            SET @idx =Charindex(@Delimiter, @String) 

            IF @idx != 0 
              SET @slice =LEFT(@String, @idx - 1) + '-01' 
            ELSE 
              SET @slice = @String + '-01' 

            IF( Len(@slice) > 0 ) 
              INSERT INTO @temptable 
                          (items) 
              VALUES     (@slice) 

            SET @String =RIGHT(@String, Len(@String) - @idx) 

            IF Len(@String) = 0 
              BREAK 
        END 

      RETURN 
  END 

直接执行示例

BEGIN 
    SELECT Cast(items AS DATETIME)               AS rangetime, 
           Row_number() 
             OVER( 
               ORDER BY items)                   AS idnum, 
           Datepart(yy, Cast(items AS DATETIME)) AS timeyear, 
           Dateadd(year, Datediff(year, 0, Dateadd(year, 1, 
                                           Cast(items AS DATETIME)) 
                         ), -1) 
                                                 AS lastday 
    INTO   #resulttb 
    FROM   dbo.Split('2018-05~2019-05', '~') AS tdata 

  DECLARE @onetime VARCHAR(50); 
      DECLARE @twotime VARCHAR(50); 
      DECLARE @wheresql VARCHAR(200);  
      DECLARE @rangetime1 VARCHAR(500); 
      DECLARE @rangetime2 VARCHAR(500); 
      DECLARE @lastday1 VARCHAR(500); 
      DECLARE @lastday2 VARCHAR(500); 

      SELECT @onetime = aaa.timeyear, 
             @twotime = bbb.timeyear, 
             @rangetime1 = CONVERT(VARCHAR, aaa.rangetime, 23), 
             @rangetime2 = CONVERT(VARCHAR, bbb.rangetime, 23), 
             @lastday1 = CONVERT(VARCHAR, aaa.lastday, 23)+' 23:59:59', 
             @lastday2 = CONVERT(VARCHAR, bbb.lastday, 23)+' 23:59:59'
      FROM   #resulttb AS aaa 
             JOIN #resulttb bbb 
             ON aaa.idnum + 1 = bbb.idnum 

      --PRINT( @onetime )   
      --PRINT( @twotime )   
      IF( @onetime = @twotime ) 
        SET @wheresql= 'paymsg between ''' + @rangetime1 
                     + ''' AND ''' + @rangetime2 +' 23:59:59' + ''''; 
      ELSE 
        SET @wheresql= 'paymsg between ''' + @rangetime1 
                       + ''' AND ''' + @lastday1 + '''' + ' OR ' 
                       + 'paymsg between ''' + @rangetime2 
                       + ''' AND ''' + @lastday2 + '''' 
	  SELECT * FROM  #resulttb 
      DROP TABLE #resulttb 
END

在这里插入图片描述

Getrangewheresql 存储过程

CREATE PROCEDURE Getrangewheresql (@String    VARCHAR(8000), 
                                   @Delimiter CHAR(1), 
                                   @wheresql  VARCHAR(200) output) 
AS 
  BEGIN 
      SET nocount ON; 

      SELECT Cast(items AS DATETIME)               AS rangetime, 
             Row_number() 
               OVER( 
                 ORDER BY items)                   AS idnum, 
             Datepart(yy, Cast(items AS DATETIME)) AS timeyear, 
             Dateadd(year, Datediff(year, 0, Dateadd(year, 1, 
                                             Cast(items AS DATETIME)) 
                           ), -1) 
                                                   AS lastday 
      INTO   #resulttb 
      FROM   dbo.Split(@String, @Delimiter) AS tdata 

      DECLARE @onetime VARCHAR(50); 
      DECLARE @twotime VARCHAR(50); 
      --DECLARE @wheresql VARCHAR(200);   
      DECLARE @rangetime1 VARCHAR(500); 
      DECLARE @rangetime2 VARCHAR(500); 
      DECLARE @lastday1 VARCHAR(500); 
      DECLARE @lastday2 VARCHAR(500); 

      SELECT @onetime = aaa.timeyear, 
             @twotime = bbb.timeyear, 
             @rangetime1 = CONVERT(VARCHAR, aaa.rangetime, 23), 
             @rangetime2 = CONVERT(VARCHAR, bbb.rangetime, 23), 
             @lastday1 = CONVERT(VARCHAR, aaa.lastday, 23)+' 23:59:59', 
             @lastday2 = CONVERT(VARCHAR, bbb.lastday, 23)+' 23:59:59'
      FROM   #resulttb AS aaa 
             JOIN #resulttb bbb 
               ON aaa.idnum + 1 = bbb.idnum 

      --PRINT( @onetime )    
      --PRINT( @twotime )    
      IF( @onetime = @twotime ) 
        SET @wheresql= 'paymsg between ''' + @rangetime1 
                      + ''' AND ''' + @rangetime2 +' 23:59:59' + ''''; 
      ELSE 
        SET @wheresql= 'paymsg between ''' + @rangetime1 
                       + ''' AND ''' + @lastday1 + '''' + ' OR ' 
                       + 'paymsg between ''' + @rangetime2 
                       + ''' AND ''' + @lastday2 + '''' 

      DROP TABLE #resulttb 
  END 

执行存储过程

DECLARE @sqlwhere VARCHAR(200)

EXEC Getrangewheresql '2018-05~2018-11','~' ,@sqlwhere output

print @sqlwhere

EXEC Getrangewheresql '2018-05~2019-10','~' ,@sqlwhere output

print @sqlwhere

在这里插入图片描述

YOLOv11人物目标检测数据集 目标类别:['Persona'] 中文类别:['人物'] 训练集:1683 张 验证集:182 张 测试集:0 张 总计:1865 张 该数据集提供了data.yaml文件,内容如下: train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: ['Persona'] YOLOv11城市街头与室内场景人物目标检测数据集 该数据集涵盖了城市街头、商业街区、办公场所及室内生活等多种场景中的人物目标检测,具有广泛的应用价值。通过多样的场景设置和丰富的拍摄角度,能够有效提升模型在复杂环境下的目标识别能力,为智慧城市、安防监控及人机交互等领域提供高质量的训练数据支持。 从数据分布来看,该数据集包含1683张训练集图像、182张验证集图像以及0张测试集图像,整体比例分配合理。训练集与验证集的比例约为9.25:1,能够充分满足模型训练与性能评估的需求,确保模型在不同场景下的泛化能力得到充分验证。 该数据集的标注工作严谨规范,所有图像均经过人工精确标注,每个目标都配有清晰的边界框和统一的标签“Persona”。标注过程遵循严格的标准,确保了数据的高质量和一致性,为后续的模型训练和性能优化提供了可靠的基础。 基于其多样化的场景覆盖和高质量的标注数据,该数据集可广泛应用于智慧城市管理、公共场所安防监控、智能零售分析以及家庭安防等多个领域。特别是在需要精准识别复杂环境中人物的目标检测任务中,该数据集能够显著提升模型的准确性和鲁棒性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值