Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-根据日期范围高效地选择数据_Sql_Sql Server - Fatal编程技术网

SQL-根据日期范围高效地选择数据

SQL-根据日期范围高效地选择数据,sql,sql-server,Sql,Sql Server,我希望根据表中的日期范围选择数据,并获取该日期范围之前的最新值 我怎样才能提高效率 该表定义如下: Name varchar(100) Checked DataType varchar(100) Checked Time datetime Checked Value int Checked 该表包含以下数据: Name DataType Time Value Nam

我希望根据表中的日期范围选择数据,并获取该日期范围之前的最新值

我怎样才能提高效率

该表定义如下:

Name       varchar(100)   Checked
DataType   varchar(100)   Checked
Time       datetime       Checked
Value      int            Checked
该表包含以下数据:

Name    DataType  Time                      Value
Name1   Type1     2010-09-29 17:29:00.000   999
Name2   Type2     2013-11-02 06:51:00.000   0
我创建了下面的查询,虽然有点冗长,但它确实返回了正确的结果。但是,我想知道是否可以使用更好的T-SQL实现这一点

我将在我的应用程序中以内嵌SQL的形式编写代码

DECLARE @effectiveFrom DATETIME
SET @effectiveFrom = '2010-09-29 17:30:00'
DECLARE @effectiveTo DATETIME
SET @effectiveTo = '2010-09-29 17:49:00'
DECLARE @bmunit varchar(100)
DECLARE @datatype varchar(100)

--Select * from [Table] 
--where  (Time >= '2010-09-29 17:30:00' and Time < '2010-09-29     17:49:00') 

--union Select top 1 * from [Table]
-- where  Time < '2010-09-29 17:30:00' order by Time desc
SELECT P1.[Name]
      ,P1.[DataType]
      ,P1.[Time]
      ,P1.[Value]
      ,P1.Que
FROM
(
  SELECT  [Name]
      ,[DataType]
      ,[Time]
      ,[Value]
      , 'between' AS [Que]
  FROM [Table]
  WHERE  Time >= @effectiveFrom AND  EffectiveTime < @effectiveTo
) P1   
UNION SELECT P2.[Name]
      ,P2.[DataType]
      ,P2.[Time]
      ,P2.[Value]
      , 'before' AS [Que]
FROM
(
  SELECT TOP 1 [Name]
      ,[DataType]
      ,Time]
      ,[Value]
  FROM [Table] P1
  WHERE  Time < @effectiveFrom

) P2 --ON P1.[Name] = P2.[Name] AND P1.[DataType] = P2.[DataType]
WHERE Name = 'MyName' --AND P1.Time >= @effectiveFrom AND P1.Time < @effectiveTo
ORDER BY 2,3  

您应该能够将其缩减为以下内容:

SELECT P1.[Name]
      ,P1.[DataType]
      ,P1.[Time]
      ,P1.[Value]
      ,'between' AS Que
FROM [Table] P1
WHERE Time >= @effectiveFrom AND Time < @effectiveTo
      AND Name = 'MyName'
UNION ALL
SELECT * FROM (
    SELECT TOP 1 P2.[Name]
          ,P2.[DataType]
          ,P2.[Time]
          ,P2.[Value]
          ,'before' AS [Que]
    FROM [Table] P2
    WHERE Time < @effectiveFrom
          AND Name = 'MyName'
    ORDER BY 3
) A
如果不喜欢重复名称检查,则选择将变得更大:

SELECT * FROM (
    SELECT P1.[Name]
          ,P1.[DataType]
          ,P1.[Time]
          ,P1.[Value]
          ,'between' AS Que
    FROM [Table] P1
    WHERE Time >= @effectiveFrom AND Time < @effectiveTo
    UNION ALL
    SELECT * FROM (
        SELECT TOP 1 P2.[Name]
            ,P2.[DataType]
            ,P2.[Time]
            ,P2.[Value]
            ,'before' AS [Que]
        FROM [Table] P2
        WHERE Time < @effectiveFrom
        ORDER BY 3
    ) A
) B
WHERE Name = 'MyName'
如果你想把它缩短,你可以试试这个,但我认为它不太可读:

SELECT P1.[Name]
      ,P1.[DataType]
      ,P1.[Time]
      ,P1.[Value]
      ,(CASE WHEN Time >= @effectiveFrom THEN 'between' ELSE 'before' END) AS Que
FROM [Table] P1
WHERE Name = 'MyName'
      AND 
      (
          (Time >= @effectiveFrom AND Time < @effectiveTo)
          OR (Time < @effectiveFrom AND NOT EXISTS (SELECT * 
                                                FROM [Table] P2 
                                                WHERE Time < @effectiveFrom
                                                    AND P2.Time > P1.Time)
          )
      )

它更短吗?

哪一个是您的RDBMS?MySQL还是SQL Server?