一尘不染

了解带有min(datetime)的SQL Server行为

sql

(长话短说,我只是一个愚蠢的假设,我确定一栏是一个日期时间,而且不是-
所以不要指望在这个问题中找到任何有趣的东西,把它留在这里以使dems正确地被他接受回答)

我写了一个简单的查询,像这样:

SELECT ID, MIN(DateMadeActive) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2, 3)
GROUP BY ID

其中DateMadeActive是日期时间列。这返回了我期望的结果:

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(expression)的文档说返回类型应该与expression相同,但是似乎正在发生的是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中的一个文档错误?


阅读 200

收藏
2021-03-08

共1个答案

一尘不染

在我看来,DateMadeActivein[RecordStateField]是VARCHAR(255)字段。您可以发布表定义吗?

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

2021-03-08