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



似乎有很多关于如何将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

相关内容

  • 没有找到相关文章

最新更新