我有一个自由文本列,其中包含我的客户提供的日期。该列的值将如下所示。
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字段的函数?
答案 0 :(得分:1)
有很多解决方案可以满足您的要求,但是因为这个问题存在缺陷。
正确的问题是:是否存在可靠方法来创建将部分日期转换为日期时间字段的函数?
答案是不,这样的功能不存在。
这是因为如果您不知道初始字符串的格式,就没有可靠的方法来判断11-05-2009
是2009-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时,就不应该编写自己的解决方案。