代码之家  ›  专栏  ›  技术社区  ›  Viks

如何从SQL中选择给定时间间隔之间的数据

  •  2
  • Viks  · 技术社区  · 8 年前

    我在SQL中有以下数据 SQL Data i am having

    需要sql队列:

    现在,我想创建类似…..的报告。用户将提供时间间隔和标记名,并在此基础上从表中选择数据;在Excel中显示 假设我的输入是: 间隔为 2016-09-21 14.00.00 2016-09-21 22.00.00 标记名称为 : 系统\年份 我需要以下输出: output result 假设当时没有记录,那么我需要空白/零值。 我想在VB6中创建它。

    1 回复  |  直到 8 年前
        1
  •  4
  •   jac    8 年前

    SELECT
        fields
    FROM table
    WHERE
        (DateAndTime BETWEEN '2016-09-21 14:00' AND '2016-09-21 22:00')
    AND
        (DATEPART(MINUTE, DateAndTime) % 60 = 0)
    

    如果需要偶数秒,只需在WHERE子句中添加另一个AND即可。

    SELECT
        fields
    FROM table
    WHERE
        (DateAndTime BETWEEN '2016-09-21 14:00' AND '2016-09-21 22:00')
    AND
        (DATEPART(MINUTE, DateAndTime) % 60 = 0)
    AND
        (DATEPART(SECOND, DateAndTime) % 60 = 0)
    

    为了回答上一条评论中的问题,我设计了一个有效的SQL查询。可能是,如果您用SQL标记发布您的确切需求,而忽略vb6、vba标记,因为这实际上都是SQL,与运行它的环境无关,那么您会得到更好的答案。这会奏效的。我建议将其合并到存储过程中。

    这通过创建一个表变量并用可能返回的时间值填充它来实现。然后它左键联接您要查询的表。当没有要联接的记录时,结果是第二个表中的空值。

    --select records on the hour from 8:00 to 5:00
    DECLARE @MinTime datetime = '2016-9-9 09:00'   --need to parameterize
    DECLARE @MaxTime datetime = '2016-9-10 17:00'  --need to parameterize
    DECLARE @TempTime datetime = @MinTime
    
    DECLARE @Times TABLE
    (
        TimeValue datetime
    )
    WHILE @TempTime <= @MaxTime
    BEGIN
        INSERT INTO @Times
        (
            TimeValue
        )
        VALUES
        (
            @TempTime
        )
        SET @TempTime = DATEADD(hour, 1, @TempTime)
    END
    
    SELECT
        CONVERT(varchar(10), TimeRange.TimeValue, 101) AS [Date]
        ,CONVERT(varchar(10), TimeRange.TimeValue, 108) AS [Time]
        ,ISNULL(Tag, 'NA')
        ,ISNULL(Value, 0)
    FROM
        @Times TimeRange
    LEFT JOIN
        table
    ON
        (CONVERT(datetime, CONVERT(varchar(10), table.DateAndTime, 101) + ' ' + CONVERT(varchar(2), DATEPART(HOUR, table.DateAndTime)) + ':' + CONVERT(varchar(2), DATEPART(MINUTE, table.DateAndTime)) + ':' + CONVERT(varchar(2), DATEPART(SECOND, table.DateAndTime))) = TimeRange.TimeValue)
    WHERE
        (TimeRange.TimeValue BETWEEN @MinTime AND @MaxTime)