首页 > 解决方案 > 在 SQL 中将字符串转换为日期

问题描述

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

我需要在 VIEW 中使用它,所以不能使用 SET LANGUAGE。听起来很简单ConvertIsDate但似乎不起作用。

因此,对于下面的代码片段(请记住,这将在视图中),我想阅读文本,如果字符串转换为日期(即在格式中,dd/mm/yyyy则运行转换为我需要的日期) Excel 要获取的日期格式(通过 Connect 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 

错误:

消息 241,级别 16,状态 1,第 15 行
从字符串转换日期和/或时间时转换失败。

idx = 2 会发生此错误。Idx = 1 可以正常工作。

对此的任何帮助将不胜感激。提前致谢。

标签: sqlsql-serverdatetsqlsql-server-2017

解决方案


您需要将结果日期转换为varchar. Acase 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

推荐阅读