如何在 TSQL 函数中检查正确的日期时间格式?

Posted

技术标签:

【中文标题】如何在 TSQL 函数中检查正确的日期时间格式?【英文标题】:How to check for the correct datetime format in TSQL function? 【发布时间】:2021-03-14 01:51:34 【问题描述】:

下面的函数需要以下字符串

22.03.2016
28.02.2017 00:00:00
NULL

有时该列包含像'22.003.2016' 这样的垃圾。

如何使用 SQL Server 2008 R2 在 T-SQL 中管理这种情况?

ALTER FUNCTION [dbo].[GetItemDocDetailDataInput] 
    (@ItemDocDetailID uniqueidentifier)
RETURNS datetime2(7) 
AS
BEGIN
    DECLARE @str nvarchar(20);
    DECLARE @dataInput datetime2(7);

    SELECT @str = ISNULL([DataInput], null) 
    FROM 
        (SELECT 
             ISNULL([Value], '') AS [Value],    
             CASE
                WHEN [Value] IS NULL THEN NULL
                ELSE SUBSTRING([Value], 0, 11)
             END AS DataInput 
         FROM 
             ItemDocDetailParams 
         WHERE 
             ItemDocDetailID = @ItemDocDetailID 
             AND ItemParamTypeID = 12) D

    SELECT @dataInput = CONVERT(datetime2(7), @str, 103) 

    RETURN @dataInput;
END

【问题讨论】:

【参考方案1】:

我认为最好的方法是创建另一个 tsql 函数,我可以在其中检查字符串中的点位置,例如

22.03.2016
28.02.2017 00:00:00

所以我将使用以下语句的组合

SELECT CHARINDEX('.', '13.05.2019') AS FirstDot; 
3 -- ОК

SELECT CHARINDEX('.', '13.05.2019', 4) AS SecondDot;
6 -- ОК

SELECT CHARINDEX('.', '13.005.2019', 4) AS MatchPosition; 
7 --- NOT OK

【讨论】:

我认为最好的方法是修复数据模型以将时间数据存储在正确键入的日期/时间类型而不是字符串中。 @DanGuzman 我知道兄弟,但没有机会这样做。无论如何,在 MS SQL Server 的更高版本中有 try_parase() 和 try_convert() TSQL 方法...

以上是关于如何在 TSQL 函数中检查正确的日期时间格式?的主要内容,如果未能解决你的问题,请参考以下文章

php 验证(检查)日期格式是否正确

Java如何检查日期格式是否正确?

TSQL 日期时间问题

如何从 tsql (sql 2005) 中的 utc 日期时间计算本地日期时间?

在PHP中如何取得英文格式的时间

检查字符串是否有日期,任何格式