在Transact中安全地从字符串转换为日期

时间:2016-02-22 14:27:44

标签: sql-server date

我在MSSQL Transact中的存储过程中有以下代码:

CAST(CONVERT(Datetime, aof.Transactiondate) AS date)

aof.Transactiondate是一个varchar(8),应该以' 20160202'或' 20160117'。 今天我发现,在极少数情况下,aof.Transactiondate可以是' 1'因此我的代码完全崩溃了。

我可以做任何事情来确保上述不会崩溃并设置一个侮辱日期或其他东西而不是崩溃吗?

理论上我可以确保varchar中有8个字符,然后将字符分成4个,2个和2个块,最后确保第1个块在2015年到2016年之间(仅在当前相关),第二个块在1到12之间,第三个块在1到31之间,但这似乎是一项巨大的工作。

3 个答案:

答案 0 :(得分:1)

  

TRY_CAST

如果转换成功,则返回强制转换为指定数据类型的值;否则,返回null。

答案 1 :(得分:1)

T-SQL在Conversion类别下有几个可用的函数,所有这些函数都带有以TRY_为前缀的变体,

如果转换成功,则将值转换为指定的数据类型;否则,返回null。

您可以像这样使用它们:

SELECT TRY_CAST('2020-05-27' AS DATE)
SELECT TRY_CONVERT(DATE, '2020-05-27')
SELECT TRY_PARSE('2020-05-27' AS DATE)

答案 2 :(得分:0)

您可以使用ISDATE()函数在转换数据前测试有效日期:

DECLARE @TransactionDate VARCHAR(8)= 1;
SELECT CONVERT( DATE,
                    CASE
                        WHEN ISDATE(@TransactionDate) = 1
                        THEN @TransactionDate
                        ELSE NULL
                    END);

SET @TransactionDate = '20160202';
SELECT CONVERT( DATE,
                CASE
                    WHEN ISDATE(@TransactionDate) = 1
                    THEN @TransactionDate
                    ELSE NULL
                END);

输出: 2016年2月2日