【发布时间】:2016-06-03 13:22:54
【问题描述】:
我有这个问题
SELECT
CASE WHEN dbo.CFE_PPHY.P77 IS NOT NULL OR dbo.CFE_PPHY.P77 <>''
THEN MONTH(dbo.CFE_PPHY.P77)
WHEN dbo.CFE_PPHY.P70 IS NOT NULL OR dbo.CFE_PPHY.P70 <>''
THEN MONTH(dbo.CFE_SERVICE_EVTS.C10_2)
ELSE COALESCE(CONVERT(VARCHAR,dbo.CFE_PPHY.P77)+
CONVERT(VARCHAR,dbo.CFE_SERVICE_EVTS.C10_2),'toto') END
AS CFELiasse_DateEffetEIRL_MM_N
FROM CFE_PPHY LEFT JOIN CFE_SERVICE_EVTS ON CFE_PPHY.colA = CFE_SERVICE_EVTS.colB
ELSE 部分让我头疼。
CFE_PPHY.P77 和 CFE_SERVICE_EVTS.C10_2 列具有日期时间格式。我正在把它们变成varchar。然而,当我运行查询时,出现以下错误
将 varchar 值“toto”转换为数据类型 int 时,消息 245,级别 16,状态 1,行 1 转换失败。
显然,我无法将toto 转换为整数。很公平。但是,从我的角度来看,我已经将 datetime 格式转换为 varchar 格式,所以它应该可以工作。
我哪里错了?
谢谢
【问题讨论】:
-
case 表达式返回列的值。 case 表达式的前两部分返回整数。月()。您不能在单个列中混合这样的数据类型。您还必须将它们转换为 varchar。您还真的需要在 varchars 上指定一个长度,而不仅仅是使用默认值。默认值为 30 或 1,具体取决于使用情况。您是否 100% 确定您知道哪个是哪个?如果 MS 在某些时候改变了你的代码,你的代码就会被破坏。
-
问题是
CASE不支持多种数据类型,在前两个条件中,您以MONTH(blah)的形式返回INT。要么将其转换为VARCHAR,要么不要使用“toto”。
标签: sql sql-server tsql datetime