【发布时间】:2011-12-12 17:00:07
【问题描述】:
我在这里处理一些设计不佳的表格,改变结构或多或少是不可能的。话虽如此,这是我的问题。
我需要在 TableA.Date 上加入 TableB.Date,间隔约 5 分钟。换句话说,连接不能依赖完美匹配。
因此,如果 TableA 中的日期为 2011-12-01 10:00:00.000,则连接将匹配 TableB 中日期为 2011-12-01 10:03:00.000 或 2011-12-01 09:59:00.000 或 2011-12-01 10:04:35.000 的记录
我想出了一个小技巧,通过将 datetime 转换为 smalldatetime 来允许大约 1 分钟的差异,这会从 datetime 值中减去秒和毫秒。它工作得很好,但我需要比这更大的余量。
LEFT JOIN TableB ON CAST(TableA.SomeDate AS smalldatetime) = CAST(TableB.SomeDate AS smalldatetime)
TableB 中的日期列是两个表中数据之间的唯一链接,因此我无法在 WHERE 子句中过滤结果。我意识到这可能会产生一些不准确的结果,但由于数据的存储方式和时间,我不应该遇到任何问题。
有什么建议吗?
【问题讨论】:
-
通过强制转换为 smalldatetime 进行截断甚至不能满足您的要求。相差一毫秒但落入不同分钟的时间将不匹配。您可以将表添加到现有数据库,例如创建一个表,将现有表中的日期/时间扩展到 5 分钟范围并编制索引?
-
这样做的问题是您必须更严格地定义 5 分钟边距。如果 tableA 上的 2 个结果彼此相差 5 分钟之内怎么办?他们是否都加入了 tableB 上的同一条记录?然后你会得到重复的记录。您可能想要做的是将您的日期时间 bin 放入 5 分钟的桶中,但这种刚性可能不适合目的。如果您真正想做的是模糊数据分析,那么 SQL 可能是错误的语言选择。
标签: sql-server sql-server-2005 sql-server-2008 tsql