仅当varchar是完整日期时才将其强制转换为日期



我正在使用一个遗留数据库,因此用户可以在三个单独的文本框(日,月,年)中输入完整的日期。验证允许以下组合:日、月、年-月、年-年。如果输入了"日、月、年",则可以很好地进行转换和与另一个完整日期进行比较。如果为NULL,则应该返回'999'。如果只输入了月、年或年,那么是否有一种方法可以避免在这样的选择语句中出现varchar到日期的转换错误?

SELECT 
ID,
CASE 
WHEN UserSelectedMonth IS NULL AND UserSelectedYear IS NULL THEN '999'
WHEN UserSelectedDay IS NULL AND UserSelectedMonth IS NOT NULL AND UserSelectedYear IS NOT 
NULL THEN '01/'+ UserSelectedMonth + '/' + UserSelectedYear
WHEN UserSelectedDay IS NOT NULL AND UserSelectedMonth IS NOT NULL AND UserSelectedYear IS NOT 
NULL THEN UserSelectedDay + '/' + UserSelectedMonth + '/' + UserSelectedYear 
ELSE '999'
END AS UserSelectedDate 
FROM ThisTable WHERE
(UserSelectedDate IS NOT NULL AND LEN(UserSelectedDate) = 10 AND UserSelectedDate <= 
CAST(AnotherSelectedFullDate AS Date))

为什么不使用TRY_CONVERTTRY_CAST?假设(因为我们没有样本数据)您的日,月和年列是固定宽度零前缀值,那么您可以轻松地将它们转换为ISO格式,这将意味着您将获得NULL值"日期";如'20210231''20171904':

TRY_CONVERT(date,CONCAT(YearColumn,MonthColumn,DayColumn))

如果你愿意,你也可以在上面添加显式的样式代码112,以指示SQL Server值必须是要转换的yyyyMMdd格式。

最新更新