使用min(datetime)了解SQL Server行为

时间:2011-06-20 16:52:38

标签: sql sql-server

(长话短说,我只是一个愚蠢的假设,我确定一个专栏是一个日期时间而不是 - 所以不要指望在这个问题上找到任何有趣的东西,留在这里以便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中的文档错误?

1 个答案:

答案 0 :(得分:5)

我认为DateMadeActive中的[RecordStateField]是VARCHAR(255)字段。你可以发表表定义吗?

我问这个,因为MIN()之前已经为我改变了类型。因此,如果结果是VARCHAR(255),则输入似乎也必须是VARCHAR(255)