这确实困扰了我几天,正在寻求帮助。我正在使用 SQL Server 2017。
我正在尝试处理来自自由格式字段的字符串,并将它们转换为“dd/mm/yyyy”格式的日期,或者如果它们不是这种格式,则简单地逐字显示文本。
我在 VIEW 中需要这个,所以不能使用 SET LANGUAGE。听起来很简单,使用转变和伊斯达但似乎不起作用。
因此,对于下面的代码片段(记住这将在视图中),我想读取文本,如果字符串转换为日期(即格式为“dd/mm/yyyy”,则运行转换为日期,因为我需要它以日期格式供 Excel 获取(通过连接 SQL Sever 数据库)),如果它没有转换为日期,则按原样显示文本。
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
-- error: Msg 241, Level 16, State 1, Line 15 Conversion failed when converting date and/or time from character string.
-- this error happens for idx = 2. Idx = 1 works ok
任何能帮我解决此问题的帮助都会非常感激,因为这让我很头疼。
提前致谢保罗
答案1
我不确定你的数据库是否适合做这个。与其他一些数据库相比,SQL Server 中的数据转换函数有点“笨拙”。
但是,从数据库的角度来看:
如果某事应该成为一个日期,那么它应该日期。
它可能“缺失”(即可为空),但不能是其他任何值。
如果它是否则,就不应该被对待作为A日期。
用户无法输入日期- 只有角色表现的。
显示应用程序中的 [数字和] 日期需要在“输出”时进行格式化。
将 [数字和] 日期读入应用程序需要相反的操作,即在“输入”时进行“取消格式化”(当然还有验证)。
数据应该总是存储在正确的数据类型——“适合正确工作的正确工具”。
自由文本解析是大概最好在您的应用程序中完成,提取日期值,验证和“取消格式化”,然后存储它。