8

希望快一点。

以下不起作用:

DECLARE @stringDate nvarchar(50)
SET @stringDate = '0001-01-01T12:00:00'

SELECT 
    @stringDate AS StringDate,
    CONVERT(datetime, @stringDate, 126) AS ConvertedDate

产生错误:将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。

实现转换的最简单方法是什么?

谢谢

4

2 回答 2

9

类型Datetime不支持 0001 年。支持的范围是 1753 到 9999。
作为一种解决方法,您可以改用DateTime2类型

SELECT 
    @stringDate AS StringDate,
    CONVERT(datetime2, @stringDate, 126) AS ConvertedDate
于 2012-04-18T10:59:39.547 回答
6

它不起作用,因为对于数据DATETIME类型

日期范围 [is] 1753 年 1 月 1 日到 9999 年 12 月 31 日。

您必须使用新的数据类型DATETIME2

SET ANSI_WARNINGS OFF;  --Not recommended
SET ARITHABORT OFF;     --Not recommended
DECLARE @stringDate nvarchar(50)
SET @stringDate = '0001-01-01T12:00:00'

SELECT 
    @stringDate AS StringDate,
    CONVERT(datetime, @stringDate, 126) AS Converted_DATETIME,
    CONVERT(datetime2, @stringDate, 126) AS Converted_DATETIME2_A,
    CONVERT(datetime2(0), @stringDate, 126) AS Converted_DATETIME2_B

结果:

StringDate          Converted_DATETIME Converted_DATETIME2_A  Converted_DATETIME2_B
------------------- ------------------ ---------------------- ----------------------
0001-01-01T12:00:00 NULL               0001-01-01 12:00:00.00 0001-01-01 12:00:00
Arithmetic overflow occurred.

DATETIME2注意:如果您的日期/时间值没有“小数秒精度” ,您可以更改数据类型的默认精度: DATETIME2(0).

于 2012-04-18T11:00:45.177 回答