SQLite查询以获得最近的日期时间。

问题描述 投票:3回答:3

我正试图写一条SQLite语句来从用户输入中获取最近的日期时间(来自WPF数据选择器)。我有一个表IRquote(rateId, quoteDateAndTime, quoteValue)。

例如,如果用户输入10012000,而数据库中只存储了08012000、07012000和14012000的固定日期,它将返回08012000,即10012000中最接近的日期。

当然,我希望它不仅适用于日期,也适用于时间。

我试着用这个查询,但是它返回的是最远的日期,而不是最近的日期。

SELECT quoteValue FROM IRquote 
WHERE rateId = '" + pRefIndexTicker + "'
ORDER BY abs(datetime(quoteDateAndTime) - datetime('" + DateTimeSQLite(pFixingDate) + "')) ASC
LIMIT 1;

请注意,我有一个函数DateTimeSQLite来将用户输入转换为正确的格式。

我不明白为什么这不工作。我怎么能做到这一点?谢谢你的帮助

sql sqlite datetime
3个回答
7
投票

为了获得最近的日期,你需要使用 "IRquote(rateId, quoteDateAndTime, quoteValue)"。strftime('%s', datetime) SQLite函数。

有了 这个 exampledemo,你将得到与你给定日期最接近的日期。请注意,日期 2015-06-25 10:00:00 是用户选择的输入日期时间。

select t.ID, t.Price, t.PriceDate,
       abs(strftime('%s','2015-06-25 10:00:00') - strftime('%s', t.PriceDate)) as 'ClosestDate'
  from Test t
 order by abs(strftime('%s','2015-06-25 10:00:00') - strftime('%s', PriceDate))
 limit 1;

SQL解释。我们使用 strftime('%s') - strftime('%s') 来计算两个日期之间的差异,以秒为单位(注意,必须是'%s',而不是'%S')。 必须是'%s',而不是'%S')。) 由于这可以是正数也可以是负数,我们还需要使用 abs 功能,使其都是积极的,以确保我们的。order by 以及随后的 limit 1 部分工作正确。


3
投票

如果表很大,并且在datetime列上有一个索引,这将使用索引来获取最接近的2行(在提供的值上下),效率会更高。

select * 
from
  ( select * 
    from 
    ( select t.ID, t.Price, t.PriceDate
      from Test t
      where t.PriceDate <= datetime('2015-06-23 10:00:00') 
      order by t.PriceDate desc
      limit 1
    ) d
  union all
    select * from
    ( select t.ID, t.Price, t.PriceDate
      from Test t
      where t.PriceDate > datetime('2015-06-23 10:00:00') 
      order by t.PriceDate asc
      limit 1
    ) a
  ) x
order by abs(julianday('2015-06-23 10:00:00') - julianday(PriceDate))
limit 1 ;

经过测试 SQLfiddle.


0
投票

另一个有用的解决方案是使用 介于 操作符,如果你能确定你的时间日期查询的上下限。我最近在这里遇到了这个解决方案。联系. 这是我在我的应用程序中使用的时间列t(改变日期列和日期函数的代码并不困难)。

select *
from myTable 
where t BETWEEN '09:35:00' and '09:45:00' 
order by ABS(strftime('%s',t) -  strftime('%s','09:40:00')) asc 
limit 1

另外,我必须纠正我对上面帖子的评论。我试着对@BerndLinde、@ypercubeᵀLm_1D39 "和我提出的这3种方法的速度进行了简单的检查。我的电脑里有大约500张表,每张表有150行,硬件中等。结果是。

  1. 解决方案1(使用strftime)需要12秒左右。
  2. 在方案1中加入t列的索引,速度提高了30%左右,需要8秒左右。使用time(t)的索引,我没有面临任何改进。
  3. 解决方案2也比解决方案1的速度提高了30%左右,需要8秒左右。
  4. 最后,方案3有50%左右的改进,耗时5.5秒左右。加入t列的索引后,改善幅度更大一些,需要4.8秒左右。时间(t)的索引在这个解决方案中没有影响。

请注意,我是一个简单的程序员。 我是一个简单的程序员,这只是一个简单的.NET代码测试。真正的性能测试必须考虑更专业的方面,我不知道这些。我的代码中也有一些计算,从数据库中查询和读取后。另外,正如@ypercubeᵀᴹ所说,这个结果我对大量的数据是无效的。

© www.soinside.com 2019 - 2024. All rights reserved.