Tsql 为什么TRY_CAST只适用于某些唱片

Tsql 为什么TRY_CAST只适用于某些唱片,tsql,datetime,try-catch,Tsql,Datetime,Try Catch,我在存储日期的Varchar字段上使用了TRY_CAST(我知道不好的做法,但我无法控制) 2018年5月12日04:30的值被输出为2018-12-05 04:30:00.000,这是不正确的,因为在英国2018年5月12日是5月12日,但是TRY_CAST输出的值是12月5日 TRY_CAST没有返回2018年5月29日07:00(5月29日)的任何值,因为我假设它认为它在29个月的第5个月不存在 ,TRY_CAST([Time decision made for caesarean sec

我在存储日期的Varchar字段上使用了TRY_CAST(我知道不好的做法,但我无法控制)

2018年5月12日04:30的值被输出为2018-12-05 04:30:00.000,这是不正确的,因为在英国2018年5月12日是5月12日,但是TRY_CAST输出的值是12月5日

TRY_CAST没有返回2018年5月29日07:00(5月29日)的任何值,因为我假设它认为它在29个月的第5个月不存在

,TRY_CAST([Time decision made for caesarean section].VALUE as datetime)
    AS DECISION_FOR_CAESAREAN_SECTION_DATE_TIME
上面的字段是我试图输出的内容

下面是原始存储值的一些示例数据,所有这些值都是英国(5月)日期


将这些输出为有效的英国日期时间的最佳方法是什么?

使用TRY\u CONVERT,它提供了TRY\u CAST没有的样式选项

SELECT 
   TRY_CONVERT(datetime, '12/05/2018 04:30', 103), 
   TRY_CONVERT(datetime, '22/05/2018 07:30', 103),
   TRY_CONVERT(datetime, 'gbn', 103)
样式103仅影响日期部分

或者,您可以先使用SET DATEFORMAT dmy格式

SET DATEFORMAT dmy
SELECT
    TRY_CAST('12/05/2018 04:30'AS datetime),
    TRY_CAST('22/05/2018 07:30'AS datetime),
    TRY_CAST('gbn'AS datetime);

那么,公平地说,
TRY\u CONVERT
不会自动为您完成所有关于计算输入掩码的工作吗?似乎有点违反直觉,我们仍然必须向它提供掩码编号+1。@TimBiegeleisen如果系统猜测掩码(从区域性配置?),这可能会在您的机器上工作,但会在生产中中断(或者更糟:使用错误数据工作一段时间)。我们永远不应该依赖于依赖于文化的格式。。。(希望系统能猜到正确的掩码…)
SET DATEFORMAT dmy
SELECT
    TRY_CAST('12/05/2018 04:30'AS datetime),
    TRY_CAST('22/05/2018 07:30'AS datetime),
    TRY_CAST('gbn'AS datetime);