SQL在开始和结束日期中分别显示小时数

SQL在开始和结束日期中分别显示小时数,sql,Sql,我需要帮助来创建查询。我的问题是我有一个开始日期和结束日期,需要将其分为60分钟一组 DECLARE @STARTDATE AS SMALLDATETIME DECLARE @ENDDATE AS SMALLDATETIME SET @STARTDATE = '2012-11-21 11:03:00' SET @ENDDATE = '2012-11-21 13:04:00' 我需要报税表: Hour, Time 11 , 57 12 , 60 13 , 04 我不确定我是否理解您的意

我需要帮助来创建查询。我的问题是我有一个开始日期和结束日期,需要将其分为60分钟一组

DECLARE @STARTDATE AS SMALLDATETIME
DECLARE @ENDDATE AS SMALLDATETIME

SET @STARTDATE = '2012-11-21 11:03:00'
SET @ENDDATE = '2012-11-21 13:04:00'
我需要报税表:

Hour, Time
11  , 57
12  , 60
13  , 04

我不确定我是否理解您的意思,但这将以60分钟的间隔返回您开始日期后的小时和分钟

DECLARE @STARTDATE AS SMALLDATETIME
DECLARE @ENDDATE AS SMALLDATETIME

DECLARE @time AS TABLE(id int identity(1,1), [hour] int, [time] int)

SET @STARTDATE = '2012-11-21 11:03:00'
SET @ENDDATE = '2012-11-21 13:04:00'

WHILE @STARTDATE < @ENDDATE
BEGIN
    SELECT @STARTDATE = DATEADD(MINUTE,60,@STARTDATE)
    INSERT INTO @time (hour,time)
    VALUES(DATEPART(HOUR,@STARTDATE),DATEPART(MINUTE,@STARTDATE))
END

SELECT * FROM @time

你可以分三部分来做。第一件是第一个小时,60减去分钟值,第二件是开始+1和结束之间所有小时的时间=60,第三件是结束分钟

然后将它们插入临时表中,就像abstractChaos所做的那样

像AbstractChaos一样插入临时表:

DECLARE @STARTDATE AS SMALLDATETIME
DECLARE @ENDDATE AS SMALLDATETIME

DECLARE @TIME AS TABLE(id INT IDENTITY(1,1), [HOUR] INT, [TIME] INT)

SET @STARTDATE = '2012-11-21 11:03:00'
SET @ENDDATE = '2012-11-21 13:04:00'

INSERT INTO @TIME (HOUR,TIME) 
VALUES (datepart(HOUR,@startdate) ,60 - datepart(MINUTE,@startdate) )

WHILE @STARTDATE < @ENDDATE
BEGIN
    SELECT @STARTDATE = DATEADD(MINUTE,60,@STARTDATE)
    INSERT INTO @TIME (HOUR,TIME) 
    VALUES(datepart(HOUR,@STARTDATE) , 60) 
END

INSERT INTO @TIME (HOUR,TIME) 
VALUES(datepart(HOUR,@enddate) , datepart(MINUTE,@startdate)) 

您可以使用递归CTE。例如:

declare @startDate datetime = '2012-11-21 22:05:00'
declare @endDate datetime = '2012-11-22 01:06:00'

; with  TimeList as
        (
        select  @startDate as dt
        union all
        select  dateadd(hour, 1, dateadd(hour, datediff(hour, 0, dt), 0))
        from    TimeList
        where   dateadd(hour, 1, dt) < @endDate
        )
select  dt
from    TimeList
union all
select  @endDate
片段dateaddhour、datediffhour、0、dt、0从日期中删除小时和分钟。它是通过计算自日期0起的小时数,然后将该小时数添加到日期0来实现的


您可能希望所需的输出与示例@startdate和@enddate时间相匹配。还有,时间栏是什么?以60为例,分或秒是没有意义的。您使用的是哪个版本的SQL Server?LittleBobbyTables,我认为它确实匹配。他不想要时间戳,他想要日期之间的分钟数。11,57意味着离12:00还有57分钟。如果开始日期或结束日期正好在小时,你想返回什么?-1作为工会的一部分,你不能使用。它甚至不会解析。这是一个好的开始,但中间的时间必须四舍五入。即13:00而不是13:03。结果中还应包括结束日期。