似乎有很多关于如何将1900-01-01
转换为NULL
的帖子,但我的问题恰恰相反。我有处理smalldatetime
(SQL Server 2008)的存储过程,但是当我真的希望它保持为1900-01-01
时,它们会继续将NULL
转换为1900-01-01
。有什么想法吗?
由于
答案 0 :(得分: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'。< / p>
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