似乎有很多关于如何转换1900-01-01
为的帖子NULL
,但我的问题恰恰相反。我有存储过程处理smalldatetime
(SQL Server 2008),但是当我真的1900-01-01
希望NULL
它保持为1900-01-01
. 有什么想法吗?
谢谢
似乎有很多关于如何转换1900-01-01
为的帖子NULL
,但我的问题恰恰相反。我有存储过程处理smalldatetime
(SQL Server 2008),但是当我真的1900-01-01
希望NULL
它保持为1900-01-01
. 有什么想法吗?
谢谢
从根本上说,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
from''
和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