从 Datetime2 安全地转换回 Datetime 的最有效方法是什么

Jam*_*mes 4 sql-server

我有一个 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 值是否适合日期时间?

Dan*_*vey 8

您应该使用 TRY_CONVERT 函数文档

如果值不正确,它将返回 null

SELECT try_convert(datetime,'1700-01-01')
Run Code Online (Sandbox Code Playgroud)


Eri*_*ing 7

如果您使用的是 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)