在SQL中将部分字符串日期转换为datetime

时间:2015-10-09 12:08:54

标签: sql-server date datetime

我有一个自由文本列,其中包含我的客户提供的日期。该列的值将如下所示。

  

2014-02

     

21-12-2013

     

2014-06-28

     

9/10/2014

     

2009

它可能包含部分日期,不同的日期格式。我需要将这些值转换为datetime。

我尝试了很多方法来转换数据,有些方法在下面。

我试图找到长度并使用以下代码检查日期是否为

CASE
        WHEN ISDATE(@stringDate) = 1 THEN CAST(@stringDate AS DATETIME)
        WHEN LEN(@stringDate) = 4 THEN CAST(('01-01' + @stringDate) AS DATETIME)
        WHEN LEN(@stringDate) = 7 THEN CAST((@stringDate + '-01') AS DATETIME)
    END

这样可以正常工作,但是当数据更改其格式时,上述代码将无效。

有没有办法创建一个将部分日期转换为datetime字段的函数?

3 个答案:

答案 0 :(得分:1)

有很多解决方案可以满足您的要求,但是因为这个问题存在缺陷。

正确的问题是:是否存在可靠方法来创建将部分日期转换为日期时间字段的函数?

答案是不,这样的功能不存在

这是因为如果您不知道初始字符串的格式,就没有可靠的方法来判断11-05-20092009-05-11还是2009-11-05

甚至你使用的解决方案:

WHEN ISDATE(@stringDate) = 1 THEN CAST(@stringDate AS DATETIME)

可能会产生错误的结果,因为字符串本身是一个日期,但值已经猜到了#39;系统取决于各种设置,它不一定与用户输入的值相同。

这是一个简单的例子:

DECLARE @stringDate AS VARCHAR(10) = '10/05/2009';
SET DATEFORMAT MDY;
SELECT CAST(@stringDate AS DATETIME); --2009-10-05 00:00:00.000
SET DATEFORMAT DMY;
SELECT CAST(@stringDate AS DATETIME); --2009-05-10 00:00:00.000

答案 1 :(得分:0)

我已经创建了一个如下功能来解决我的需求。

CREATE FUNCTION [dbo].[fn_DateConvert] 
(
    -- Add the parameters for the function here
    @inDate varchar(15)
)
RETURNS DATETIME
AS
BEGIN
    DECLARE @OutDate datetime

SET @OutDate = (SELECT
        CASE
            WHEN ISDATE(@inDate) = 0 AND
                LEN(@inDate) > 8 THEN CONVERT(DATETIME, CONVERT(DATETIME, @inDate, 103), 121)
            WHEN ISDATE(@inDate) = 0 AND
                LEN(@inDate) = 4 THEN CAST('01-01-' + @inDate AS DATETIME)
            WHEN ISDATE(@inDate) = 0 AND
                LEN(@inDate) = 7 AND
                @inDate LIKE '%-%' THEN CAST(@inDate + '-01' AS DATETIME)
            WHEN ISDATE(@inDate) = 0 AND
                LEN(@inDate) = 7 AND
                @inDate LIKE '%/%' THEN CAST(@inDate + '/01' AS DATETIME)
            ELSE CAST(@inDate AS DATETIME)
        END)

    -- Return the result of the function
    RETURN @OutDate
END

答案 2 :(得分:0)

我认为当有更好的内置函数str_to_date时,就不应该编写自己的解决方案。

  

示例http://www.mysqltutorial.org/mysql-str_to_date/