SQLServer 时间段分隔,时间段查询,查询时间段内的数据
程序员文章站
2022-05-09 15:23:54
...
我们经常碰到需要查询时间段内的数据,以下函数能有所有帮助,
有了这个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, 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)