如何停止SQL Server将1900-01-01转换为NULL

时间:2015-03-16 21:10:40

标签: sql sql-server smalldatetime

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

由于

1 个答案:

答案 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的当前设置。如果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.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