0

似乎有很多关于如何转换1900-01-01为的帖子NULL,但我的问题恰恰相反。我有存储过程处理smalldatetime(SQL Server 2008),但是当我真的1900-01-01希望NULL它保持为1900-01-01. 有什么想法吗?

谢谢

4

1 回答 1

0

从根本上说,SQL Server 无法区分。

1900-01-01 00:00:00.000是 SQL Server 日历的纪元(零点)。如果你在 SQL Server 中这样说:

select 'empty string',convert(datetime,'')

它的转换算法不会抛出错误,它将空字符串转换为 SQL Server 日期/时间值......(你猜对了!)......'1900-01-01 00.00.00.000'。

值会发生什么null取决于 SQL Server SET 选项的当前设置SET CONCAT_NULL_YIELDS_NULL。如果offnull值本质上被视为与空字符串相同。

就您的存储过程问题而言(存储过程将日期/时间值1900-01-01转换为null...这是您的存储过程的问题。SQL Server 不会自动将非空日期/时间值转换1900-01-01 00.00.00.000null:有人是明确地这样做。

默认情况下,旧版本的 SQL Server 倾向于将 null 和空字符串几乎互换。我怀疑你的系统已经存在很长时间了。

因此,SQL Server 往往很难区分实际的非空日期/时间值1900-01-01 00.00.00.000from''null

由于您没有向我们展示任何代码,我的怀疑是您的存储过程在某处具有类似于以下内容的代码:

select some_date_time_column = case when t.some_date_time_column == '' then null else t.some_date_time_column end
from some_table t
于 2015-03-16T21:36:07.790 回答