【发布时间】:2016-11-30 09:51:34
【问题描述】:
多年来我一直使用这种格式来截断日期和时间
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, '1980-02-05 12:45'), 0) AS Hour ,
DATEADD(DAY, DATEDIFF(DAY, 0, '1980-02-05 12:45'), 0) AS Day ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, '1980-02-05 12:45'), 0) AS Month ,
DATEADD(YEAR, DATEDIFF(YEAR, 0, '1980-02-05 12:45'), 0) AS Year;
但我需要存储很早的日期,例如1400-01-01,因此我可以使用DateTime2。
但是我如何支持使用DateTime2 仍然像上面那样截断的能力?
将上面的年份从 1980 更改为 1400 将导致
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, '1400-02-05 12:45'), 0) AS Hour ,
DATEADD(DAY, DATEDIFF(DAY, 0, '1400-02-05 12:45'), 0) AS Day ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, '1400-02-05 12:45'), 0) AS Month ,
DATEADD(YEAR, DATEDIFF(YEAR, 0, '1400-02-05 12:45'), 0) AS Year;
导致将 varchar 数据类型转换为 datetime 数据类型 在一个超出范围的值。
所以投射到DateTime2
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, CAST('1400-02-05 12:45' AS DATETIME2)),0) AS Hour ,
DATEADD(DAY, DATEDIFF(DAY, 0, CAST('1400-02-05 12:45' AS DATETIME2)),0) AS Day ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, CAST('1400-02-05 12:45' AS DATETIME2)), 0) AS Month ,
DATEADD(YEAR, DATEDIFF(YEAR, 0, CAST('1400-02-05 12:45' AS DATETIME2)), 0) AS Year;
将 datetime2 数据类型转换为 datetime 数据类型 导致超出范围的值。
我假设0 被视为DateTime 数据类型并有效地将其转换为DateTime。
尝试使用 CAST(0 AS DATETIME2) 将 0 转换为 DateTime2 会出现此错误
不允许从数据类型 int 到 datetime2 的显式转换。
最后,我想将这些用作表中的持久列,这些列在 DateTime 数据类型上工作得很好,但在 DateTime2 上却不那么容易
【问题讨论】:
-
提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案,例如DateFromParts.
标签: sql-server tsql datetime