我的SQL查询出了什么问题?

时间:2010-11-05 14:06:09

标签: sql

SELECT id, 
       sageaccount, 
       sageid, 
       totalwithoutvat, 
       vat, 
       total, 
       invoicedate, 
       alloweditting, 
       finished, 
       CASE WHEN isposted = 1 THEN 'Posted on ' + posteddate 
           ELSE 'Not Posted' 
       END AS Posted 
FROM Invoices 
WHERE (sageaccount = @sageaccount)

如果我把“+ postdate”带走,它的效果非常好。但是使用+ posteddate,我收到了这个错误:

从字符串转换datetime时转换失败。

publishdate字段通常为null,除非posted为true,而且publishdate的格式为definetly datetime。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您需要将publishdate转换为varchar值,以便将其与另一个varchar值连接('Posted on')

SELECT  id, 
        sageaccount, 
        sageid, 
        totalwithoutvat, 
        vat, total, 
        invoicedate, 
        alloweditting, 
        finished, 
        CASE WHEN isposted = 1 THEN 'Posted on ' + CONVERT(varchar(10), posteddate, 20) ELSE 'Not Posted' END AS Posted 
FROM Invoices 
WHERE (sageaccount = @sageaccount)

答案 1 :(得分:1)

我怀疑你是在抱怨你试图在字符串中添加日期。取决于您使用的平台:

1)确保可以使用“+”实现字符串连接。您可能需要调用函数,例如CONCAT()

2)将日期转换为字符串。

答案 2 :(得分:0)

您正在添加两个具有不同类型的值,因此数据库会尝试将其中一个值转换为另一个类型。

在连接之前将datetime值转换为字符串:

SELECT
  id, sageaccount, sageid, totalwithoutvat, vat, total,
  invoicedate, alloweditting, finished,
  CASE
    WHEN isposted = 1 THEN 'Posted on ' + convert(varchar, posteddate)
    ELSE 'Not Posted'
  END AS Posted
FROM Invoices
WHERE sageaccount = @sageaccount

答案 3 :(得分:0)

必须首先将PostedDate视为字符串,然后才能将其加入另一个字符串。 你可以这样做转换

CONVERT(varchar(10),posteddate,101)

CONVERT的语法: CONVERT(data_type [(length)],expression [,style])

样式是可选的

以下是一些样式样本:

101 = mm / dd / yyyy ex。 01/02/1999

102 = yy.mm.dd ex。 99.02.01

103 = dd / mm / yyyy ex。 1999年2月1日