似乎有很多关于如何将1900-01-01
转换为NULL
的帖子,但我的问题恰恰相反。我有存储过程处理smalldatetime
(SQL Server 2008),但是当我真的希望它保持1900-01-01
时,它们不断将1900-01-01
转换为NULL
。有什么想法吗?
谢谢
从根本上说,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
的当前设置。如果off
,则null
值基本上与空字符串相同。
问题而言(存储过程将日期/时间值 1900-01-01
转换为null
......这是存储过程的问题。SQL Server 不会自动将 1900-01-01 00.00.00.000
的非空日期/时间值转换为 null
:有人正在显式执行此操作。
默认情况下,旧版本的SQL Server倾向于将null和空字符串互换处理。我怀疑你的系统已经存在了很长时间。
因此,SQL Server 往往很难将实际的非空日期/时间值 1900-01-01 00.00.00.000
与''
和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