(长话短说,我只是一个愚蠢的假设,我确定一个专栏是一个日期时间而不是 - 所以不要指望在这个问题上找到任何有趣的东西,留在这里以便dems得到他理所当然地接受了答案)
我写了一个简单的查询:
SELECT ID, MIN(DateMadeActive) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2, 3)
GROUP BY ID
DateMadeActive是datetime列。这回归了我的预期:
ID DateMadeActive
1 20/06/2011 16:15:04
2 20/06/2011 16:14:28
现在我将它插入到一个新表中,但是将MIN(DateMadeActive)的结果插入到另一个表的datetime列中,这给了我这个错误:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.
为了测试这个,我将我的选择更改为:
SELECT ID, CAST(Min(DateMadeActive) as datetime) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2, 3)
GROUP BY ID
相同的例外。我可以像这样写它并让它工作:
SELECT ID, CONVERT(datetime, Min(DateMadeActive), 103) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2, 3)
GROUP BY ID
所以我可以让它工作,但这让我很困惑。 MIN(表达式)的documentation表示返回类型应该与表达式相同,但似乎正在发生的是MIN(datetime)返回nvarchar(255)。我可以通过运行以下来确认这一点:
SELECT ID, Min(DateMadeActive) AS DateMadeActive
INTO TestTable
FROM RecordStateField WHERE RecordStatusID in (2, 3)
GROUP BY ID
我可以看到DateMadeActive列的类型为nvarchar(255)。有人对此有所了解吗?只是MSDN中的文档错误?
答案 0 :(得分:5)
我认为DateMadeActive
中的[RecordStateField]
是VARCHAR(255)字段。你可以发表表定义吗?
我问这个,因为MIN()之前已经为我改变了类型。因此,如果结果是VARCHAR(255),则输入似乎也必须是VARCHAR(255)