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

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

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

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

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

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

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, -@minute, 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)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值