我有一个 etl 项目,其中源有 60 个 datetime2 列,目标完全是 datetime。
几天前,我们醒来发现一个空的数据仓库,因为一家医院的一名用户为一名患者输入了手术日期“1220-01-01”。
我通过在自定义函数中处理每一列来暂时解决这个问题:
ALTER function [dbo].[scrub_datetime2](@date datetime2)
returns date
as
begin
declare @return date
set @return = case when @date <= '1800-01-01' then null else @date end
return @return
end
Run Code Online (Sandbox Code Playgroud)
这对于摆脱红色文本很有效,但它也使工作运行所需的时间增加了一倍。我很高兴尽自己的一份力量,让服务器机房里的仓鼠在圣诞节期间保持温暖,但我真的无法证明为此问题浪费了 2.5 小时的宝贵过夜时间。
问题如何最有效地检查 datetime2 值是否适合日期时间?
您应该使用 TRY_CONVERT 函数文档
如果值不正确,它将返回 null
SELECT try_convert(datetime,'1700-01-01')
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 SQL Server 2012 或更高版本,并且您的数据库的兼容性级别为 110 或更高,则可以使用TRY_CONVERT
.
如果没有,用内联表值函数代替标量值函数应该会有所帮助。
CREATE FUNCTION dbo.scrub_datetime2
(
@date datetime2
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT
CASE WHEN @date < '1753-01-01'
THEN NULL
ELSE CONVERT(date, @date)
END AS date_converted;
GO
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
408 次 |
最近记录: |