我使用的是SQL Server 2017。我试图从自由格式字段处理字符串,并将它们转换为"dd/mm/yyyy"格式的日期或者,如果它们不是这种格式,则只需逐字显示文本。
我需要这个在一个视图,所以不能使用SET语言。使用Convert
和IsDate
听起来很简单,但似乎不起作用。
所以对于下面的代码片段(记住这将是在一个视图中),我想读取文本,如果字符串转换为日期(即。格式为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可以。
如果有任何帮助,我将不胜感激。提前谢谢。您需要将结果日期转换为varchar
。case 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
,WEEKDAY
和YEAR
功能的列,我得到…