【发布时间】:2017-11-26 03:39:54
【问题描述】:
我正在尝试将数字 (16,8) 添加到 smalldatetime。我收到一个我无法理解的溢出错误。
metric_value 是数字,business_date 是 smalldatetime。
SELECT
rsda.name
, business_date
, metric_value
, DATEADD(dd, metric_value, business_date) AS o_dt
, metric.name
FROM [redacted] met
INNER JOIN [redacted] rsda ON met.bu_id = rsda.data_accessor_id
INNER JOIN Metric ON met.metric_id = metric.metric_id
WHERE CHARINDEX('Remodel', metric.name) > 0
Msg 517, Level 16, State 2, Line 1
Adding a value to a 'smalldatetime' column caused an overflow.
我意识到显而易见的答案是“您的某个日期添加到 9999 年之后”,但这里的情况并非如此。所有日期都是 2017 年,所有数字都是 100 以下的整数,至少在 WHERE 子句为真时是这样。
met 表有大量与我的“改造”标准无关的数据,我想知道这是否会导致错误。这是一张奇怪的桌子,但我无法控制它的设计。是否有可能在应用我的 WHERE 子句之前发生部分 DATEADD 过程?我无法想象还会发生什么。
编辑。当我删除 DATEADD 字段时:
这是“ORDER BY business_date ASC”的第一行
+----------+---------------------+--------------+-------------+
| name | business_date | metric_value | name |
+----------+---------------------+--------------+-------------+
| 466 - 94 | 2017-03-13 00:00:00 | 59.00000000 | FullRemodel |
+----------+---------------------+--------------+-------------+
ORDER BY business_date DESC
+----------+---------------------+-------------+-------------+
| 440 - 87 | 2017-07-31 00:00:00 | 38.00000000 | FullRemodel |
+----------+---------------------+-------------+-------------+
按 metric_value ASC 排序
+----------+---------------------+------------+----------------+
| 471 - 05 | 2017-05-01 00:00:00 | 0.00000000 | PartialRemodel |
+----------+---------------------+------------+----------------+
按 metric_value DESC 排序
+----------+---------------------+-------------+-------------+
| 466 - 86 | 2017-03-13 00:00:00 | 59.00000000 | FullRemodel |
+----------+---------------------+-------------+-------------+
【问题讨论】:
-
smalldatetime 只到 2079 年 6 月 6 日
-
好的,很高兴知道。但在这种情况下,任何日期都不会超过 2017 年。
-
我会删除 DATEADD() 字段并查看返回的数据,看看 metric_value 或 business_date 字段中是否存在意外情况。
-
我已经这样做了。但我会用“证明”编辑我原来的问题
-
“是否有可能在应用我的 WHERE 子句之前发生了部分 DATEADD 过程?”。是的。同stackoverflow.com/q/7192524/73226
标签: tsql