将varchar转换为日期ddmmyyyy时出错

rdrgkggo  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(249)

我有一个 varchar 列的格式为ddmmyyyy,我正在尝试将其转换为dd mm yyyy格式的日期。我正在使用下面的查询,但出现错误:
从字符串转换日期和/或时间时转换失败。

select *, coalesce(try_convert(date, newdate, 105), convert(date, newdate)) 
from mydate
bqucvtff

bqucvtff1#

你没有约会,你有一个字符串。因此,可以使用字符串操作:

select stuff(stuff(newdate, 5, 0, '-'), 3, 0, '-')

如果要转换为日期,可以执行以下操作:

select convert(date, concat(right(newdate, 4), substring(newdate, 3, 2), left(newdate, 2)))

然后可以根据需要格式化它。
但是,不应将值转换为日期。你首先应该把它存储为一个日期。

pn9klfpd

pn9klfpd2#

把你的字符串变成日期,你可以 [try_]cast() 信息技术;sql server通常具有足够的灵活性,可以自行确定格式:

try_cast(newdate as date)

如果要将其转换回目标格式的字符串,则可以使用 format() :

format(try_cast(newdate as date), 'dd-MM-yyyy')

与纯字符串操作相比 try_cast() / format() 方法是验证字符串是否是流程中的有效日期。

tjvv9vkg

tjvv9vkg3#

必须同意其他人的意见。为什么要首先将日期存储为字符串?以非标准格式,不少于?这里有一种方法,但您确实应该修复数据模型。将日期存储为日期。

DECLARE @badIdea table (dt char(8));

INSERT @badIdea(dt) VALUES('21052020');

SELECT newdate = TRY_CONVERT(date, RIGHT(dt,4) + SUBSTRING(dt,3,2) + LEFT(dt,2))
  FROM @badIdea;

BTW105不起作用,因为它需要破折号。这样做有效:

SELECT CONVERT(date, '21-05-2020', 105);

这格式也不好,伊莫,因为谁知道 07-08-2020 七月八日或八月七日。但至少sql server支持这一点。你现在的选择不是。

bjg7j2ky

bjg7j2ky4#

sql不以不同的格式存储日期数据类型,尝试并调整它可能不是一个好主意。
但是,如果您希望结果集只是以不同的格式显示日期,那么您的做法是正确的。您只需要将日期数据类型转换为字符串。

SELECT  *
        , COALESCE ( TRY_CONVERT ( CHAR(10), newdate, 105 ), CONVERT ( CHAR(10), newdate ) ) 
FROM    mydate

相关问题