Sql server 2008 如何在使用SQLServer2008的CASE语句中同时使用varchar和Datetime数据类型?
我有一个存储过程,我正在使用这个变量,即Sql server 2008 如何在使用SQLServer2008的CASE语句中同时使用varchar和Datetime数据类型?,sql-server-2008,stored-procedures,sql-order-by,Sql Server 2008,Stored Procedures,Sql Order By,我有一个存储过程,我正在使用这个变量,即@orderBy 下面是我的代码: ORDER BY CASE WHEN @orderBy = 'ClientName' THEN c.LastName WHEN @orderBy = 'EmployerName' THEN cda.Name WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate END
@orderBy
下面是我的代码:
ORDER BY
CASE
WHEN @orderBy = 'ClientName' THEN c.LastName
WHEN @orderBy = 'EmployerName' THEN cda.Name
WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate
END
问题是当我使用@orderBy
变量时,它是一个varchar,并且在第三行给出了错误:
将字符串转换为smalldatetime数据类型时,转换失败。
如果我在@orderBy='EmploymentDate'时注释第三行,即,然后在cda.StartDate
如何克服此数据类型转换错误
提前感谢。请尝试更换
WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate
与
您可以使用每列一个大小写来删除混合类型
ORDER BY
CASE WHEN @orderBy = 'ClientName' THEN c.LastName END,
CASE WHEN @orderBy = 'EmployerName' THEN cda.Name END,
CASE WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate END
您必须分离数据类型
ORDER BY
CASE
WHEN @orderBy = 'ClientName' THEN c.LastName
WHEN @orderBy = 'EmployerName' THEN cda.Name
ELSE ''
END,
CASE
WHEN @orderBy = 'EmploymentDate' THEN cda.StartDate
ELSE '19000101'
END
或者将smalldatetime转换为varchar,但保留排序逻辑
ORDER BY
CASE
WHEN @orderBy = 'ClientName' THEN c.LastName
WHEN @orderBy = 'EmployerName' THEN cda.Name
--gives "yyyy-mm-ddThh:mm:ss.mmm "
WHEN @orderBy = 'EmploymentDate' THEN CONVERT(varchar(30), cda.StartDate, 121)
END
或者根据AlexK的回答,有3个单独的案例告诉我哪一个是更好的解决方案?你的还是另一个?告诉我哪一个更好?你的还是其他的?“2011年12月27日”将出现在“2011年6月28日”之前,因为她是对的。如果我们比较2011年6月28日下午1:26点和2011年8月1日下午1:26点,将不会保持上升顺序。您应该应用额外的格式或使用第二个答案解决方案。您可以按照gbn的答案中给出的方式进行转换,但我会选择每列的案例,因为在不需要转换的情况下,这更有效。好的,3个单独的案例更吸引我。感谢您的帮助查看本文。它写在2003年,但仍然相关。
ORDER BY
CASE
WHEN @orderBy = 'ClientName' THEN c.LastName
WHEN @orderBy = 'EmployerName' THEN cda.Name
--gives "yyyy-mm-ddThh:mm:ss.mmm "
WHEN @orderBy = 'EmploymentDate' THEN CONVERT(varchar(30), cda.StartDate, 121)
END