SQL函数错误将null日期转换为String

时间:2011-10-22 19:56:08

标签: sql adventureworks

我正在使用Adventureworks2008R2数据库并尝试呈现以下内容。 我在SQL查询中遇到了Case子句的问题。

表中的Enddate是date数据类型

SELECT  
         Firstname,
            Lastname, 
            Startdate,
            'END DATE' =
              CASE   
                WHEN (ENDDATE is  null) Then 'Still Working'
                ELSE EndDate
               END
FROM 
     DIMEMPLOYEE

这是我得到的错误。

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

我知道为什么会这样,但不知道容易解决? 的更新

我想要的是当endate不为null时,用“仍在工作”字符串替换该列。

3 个答案:

答案 0 :(得分:4)

CAST列周围放置一个EndDate可以帮助您。我认为CASE语句正在定义具有string数据类型的列。

CASE
WHEN (EndDate IS NULL) THEN 'Still working'
ELSE CAST(EndDate AS VARCHAR)
END

答案 1 :(得分:1)

FWIW,这是适用的CASE文档:

  

input_expression和每个when_expression的数据类型必须相同或必须是隐式转换... [还有] else_result_expression的数据类型,任何result_expression必须相同或必须是隐式转换< /强>


应答:

  

为什么我应该将它转换为Varchar,因为我没有将数据存储在数据库中,Select应该渲染它吗?

这是一个要求(CASE具有 fixed 结果类型)的原因是结果集中的每个记录(元组)必须具有相同的类型。如其他答案中所指出的,明确的强制到VARCHAR,将数据“扩展”为一种普通类型。

结果集的模式与结果集本身的数据是分开的,并且(至少在非OORDMBS中)是invariantCASE语句本身通过隐式转换是逆变的) - 这就是“只是SQL工作的方式”,并且结果集是否被送入另一个选择/加入或返回给客户端并不重要。 “客户端”很可能是运行远程查询的另一台服务器; - )

想象一下这个无效的结果集(这是SQL Server拒绝的):

schema: {int, date}
{1: int, 2001.10.22: date}
{2: int, "Hello world": string} <-- misshaped record! must agree with schema!

快乐的编码。

答案 2 :(得分:0)