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



我使用的是SQL Server 2017。我试图从自由格式字段处理字符串,并将它们转换为"dd/mm/yyyy"格式的日期或者,如果它们不是这种格式,则只需逐字显示文本。

我需要这个在一个视图,所以不能使用SET语言。使用ConvertIsDate听起来很简单,但似乎不起作用。

所以对于下面的代码片段(记住这将是在一个视图中),我想读取文本,如果字符串转换为日期(即。格式为dd/mm/yyyy,然后运行转换为日期,因为我需要Excel的日期格式(通过连接SQL Server数据库)),如果它不转换为日期,则显示文本。

create table dateTest1 
( 
idx int, 
dateStringTest varchar(15) 
); 

insert into dateTest1 (idx, dateStringTest) 
values (1, '13/01/2021'), (2, 'no'); 

select 
case 
when isdate(convert(datetime, dateStringTest, 103)) = 1 
then convert(datetime, dateStringTest, 103)
else dateStringTest 
end as dtres
from 
dateTest1 
--where idx = 1 

错误:

Msg 241, Level 16, State 1, Line 15
从字符串转换日期和/或时间失败。

这个错误发生在idx = 2。Idx = 1可以。

如果有任何帮助,我将不胜感激。提前谢谢。

您需要结果日期转换为varcharcase expression只能返回单一数据类型,优先级顺序意味着它仍在尝试将varchar值转换为datetime

select 
case when isdate( dateStringTest) = 1 
then Cast(convert(datetime, dateStringTest, 103) as varchar(10))
else dateStringTest 
end as dtres
from dateTest1 

可以压缩成一条语句(适用相同的优先级顺序)

select IsNull(Cast(Convert(datetime,Try_Cast(dateStringTest as date),103) as varchar(10)),dateStringTest)
from datetest1

根据您使用的语法,我假设您正在使用SQL Server。你应该给你的问题加上适当的标签。

在一列中这样做的唯一方法是将其保留为文本。

您使用ISDATE()是不正确的。如果dateStringTest不是一个有效的日期,SQL Server上的CONVERT()将抛出如下错误:

将varchar数据类型转换为日期时间数据类型导致值超出范围。

这就是为什么你会得到idx=2的错误

你说你"需要日期格式的数据,以便Excel拾取"。Excel如何解释它可能取决于您的区域设置。假设mm/dd/yyyy在您的区域设置中有效,Excel可能已经将其视为日期。但我假设没有发生这种情况,所以mm/dd/yyyy对您的区域设置无效。对于我来说,如果我在SQL中有这个表…

create table dateTest1 (
id int identity(1,1) not null,
dateStringTest varchar(20)
)
insert dateTest1
values
('2020-01-01')
, ('2020-21-01')
, ('2020-01-21')
, ('1/1/2020')
, ('1/21/2020')
, ('21/1/2020')
, ('21/01/2020')
, ('other stuff')

…并从Excel中查询,添加具有DATEVALUE,DAY,WEEKDAYYEAR功能的列,我得到…

<表类>iddateStringTestDATEVALUE天工作日年tbody><<tr>12020-01-014383114202022020-21-01#价值!#价值!#价值!#价值!32020-01-2143851213202041/1/20204383114202051/21/2020438512132020621/1/2020#价值!#价值!#价值!#价值!721/01/2020#价值!#价值!#价值!#价值!8其他东西#价值!#价值!#价值!#价值!

相关内容

  • 没有找到相关文章

最新更新