sql - 计算最近时间的优雅方法

标签 sql sql-server sql-server-2005 graphics

我有一个引用时间:

'2012-05-01 23:35:00'

我在某个表中还有几次,其中“yyyy-MM-dd”日期部分不相关,但相关的是带有“HH:分钟”的日期部分

------------------------------
| ID |         Time          |
| -- |-----------------------|
| 01 | '1900-01-01 13:10:00' |
| 02 | '1900-01-01 07:01:00' |
| 03 | '1900-01-02 00:45:00' |
| 04 | '1900-01-02 18:00:00' |
------------------------------

我正在编写一个函数,该函数将返回时间最接近的行(在上面的示例中,这将是 ID 03),但我不喜欢我正在编写的内容。

所以我开始以图形方式观察问题。有没有办法用 Atan 函数来做到这一点?

编辑:我正在使用 MSSQL server 2005

最佳答案

declare @reftime datetime;
set @reftime = '20120501 23:00:00';

    select TOP(1) with ties
           id, time
      from (
    select
           t.*,
           dateadd(d, -datediff(d, 0, @reftime), @reftime) reftime,
           dateadd(d, -datediff(d, 0, t.time), t.time) coltime
      from tbl t
           ) x
  order by (select min(diff)
            from 
            (select abs(datediff(ms, reftime, coltime))
             union all
             select abs(datediff(ms, reftime+1, coltime))
             union all
             select abs(datediff(ms, reftime, coltime+1))) y(diff));

注释:

  1. datediff(d, -datediff(...) 模式从日期时间中删除日期部分。
  2. 为了处理跨午夜场景,除了 abs(reftime-coltime) 之外,还测试了 reftime+1coltime+1 >.
  3. ORDER BY 是在所有 3 个场景中测试的最小差异范围内执行的。

关于sql - 计算最近时间的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409082/

相关文章:

sql - 替换字符串 SQL

c# - 错误-使用SQLDataReader时即使存在数据,“在没有数据存在时也无效的读取尝试。”

sql - 从 Virtual PC 连接到 SQL 服务器

sql - 何时使用 GROUPING SETS、CUBE 和 ROLLUP

sql - 如何检索或读取 SQL 中特定列的注释

mysql - 一种使用列项进行计数的方法

mysql - 左连接最新记录(如果存在)

c# - Entity Framework : query against view in EF (C# code) returns duplicate results

sql - 找到最近目的地的最快方法

java - 将字符串或整数数组转换为逗号分隔的整数或条件中的 sql 字符串