欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQLServer 时间段分隔,时间段查询,查询时间段内的数据

程序员文章站 2022-05-09 15:23:54
...

我们经常碰到需要查询时间段内的数据,以下函数能有所有帮助,

有了这个table后可以将需要分段查询的数据left join 关联该表,

然后就可以分组求和了,具体如何使用得看大家的情景

将一天的时间进行时间段分隔,效果如下

SQLServer 时间段分隔,时间段查询,查询时间段内的数据

--这是一个写好的函数,复制代码执行就好,调用方式:

SELECT  *  FROM    dbo.fun_getDateTimeSpacing('', 120)

函数代码如下

ALTER FUNCTION [dbo].fun_getDateTimeSpacing
    (
      @DateTime VARCHAR(25) = '2019-12-19 11:16:41' ,--时间,默认为当前系统时间
      @minute INT = 60 --间断分钟数 建议值:15,20,30,60,120,不能低于15分钟
    )
RETURNS TABLE
AS RETURN
    (
WITH    tbSource
          AS ( SELECT   DATEADD(DAY, 0, DATEDIFF(DAY, 0, CASE WHEN ISNULL(@DateTime,'')='' THEN GETDATE()ELSE @DateTime END  )) _time
               UNION ALL
               SELECT   DATEADD(MINUTE, @minute, a.[_time]) _time
               FROM     tbSource a
               WHERE    a.[_time] < DATEADD(MINUTE, aaa@qq.com, DATEADD(DAY, 0, DATEDIFF(DAY, -1, CASE WHEN ISNULL(@DateTime,'')='' THEN GETDATE()ELSE @DateTime END)))
             ),
        tbTime
          AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY a.[_time] ) _row , * FROM     tbSource a
               UNION ALL
               SELECT   ( SELECT    COUNT(1) FROM  tbSource ) + 1 _row , DATEADD(DAY, 1, DATEDIFF(DAY, 0, CASE WHEN ISNULL(@DateTime,'')='' THEN GETDATE()ELSE @DateTime END)) _time
             )
    SELECT  a.[_row],
			CONVERT(VARCHAR(19), a.[_time], 121) startTime ,
            CONVERT(VARCHAR(19), b.[_time], 121) endTime
    FROM    tbTime a
            LEFT JOIN tbTime b ON b.[_row] = a.[_row] + 1
    WHERE   ISNULL(b.[_time], '') > ''
)
--获取1900年1月1日零点整
SELECT  DATEADD(DAY, 0, 0)
--获取当前与1900年1月1日零点整相差多少天
SELECT  DATEDIFF(DAY, 0, GETDATE())
--在1900年1月1日0点的基础上增加以上天数(得当前日期的零点整)
SELECT  DATEADD(DAY, 0, DATEDIFF(DAY, 0, GETDATE()))
--获取短时间字符串
SELECT  CONVERT(VARCHAR(8), GETDATE(), 14)

 

相关标签: SQL Server