2014-09-02 300 views
2

我正在尝试在case语句中使TODATETIMEOFFSET工作。当我尝试执行此操作时,SQL返回错误。如果它不在case语句中,可以正常工作。我究竟做错了什么?case case语句中的TODATETIMEOFFSET

SELECT AP.POR, 
     AP.POD Path, 
     TODATETIMEOFFSET(AP.StartTime, '-06:00') as StartTime, 
     MinimumPrice = (
     CASE WHEN (CHARINDEX('','' + '''[email protected]+''' + '','', '','' + '''[email protected]+''' + '','') > 0) 
       THEN TODATETIMEOFFSET(AP.MinimumPrice, '-06:00') 
       ELSE ((
       CASE WHEN (getdate() < C.ClearingTime and C.OpenPriceMask = 0) 
         THEN NULL 
        WHEN (getdate() > C.ClearingTime and C.ClearedPriceMask = 0) 
         THEN NULL 
        ELSE AP.MinimumPrice 
       END 
      )) 
     END 
     ), 
     AP.ClearingPrice, 
     AP.PriceUnits 
    FROM TES_Auction C 
     INNER JOIN TES_AuctionPrice AP ON AP.AuctionID = C.ID 
Msg 206, Level 16, State 2, Line 1 
Operand type clash: decimal is incompatible with datetime2 

还我怎样才能使 '为' case语句的语法里面工作?

+0

正如一个侧面说明,你有办法更括号不必要。虽然它们有时对可读性有帮助,但其他时间(例如'ELSE'子句中的双括号),它们只会增加线路噪声并伤害可读性。将代码分割成多行并仔细考虑缩进会比创建更多的括号来使复杂的SQL查询更易于理解和维护。 – 2014-09-02 16:32:53

+0

谢谢乔丹.. – 2014-09-02 18:59:09

回答

4

它看起来像你有你的查询,这部分的错误:

THEN TODATETIMEOFFSET(AP.MinimumPrice, '-06:00') 

AP.MinimumPrice我希望小数类型,SQL不能将十进制转换为datetime2

而且,对一个case语句使用列别名,你会把它在最后只是下一个逗号之前,例如:

ELSE AP.MinimumPrice END))END) AS myColumnName, -- etc. 
+0

AP.MinimumPrice会像'2013年2月01日02:00:00.000 -06:00'。 TODATETIMEOFFSET(AP.StartTime,'-06:00')作为StartTime, - 这部分工作正常,它返回像我上面所述的东西。 唯一我无法弄清楚的是为什么这在case语句中不起作用。 感谢您的信息。 – 2014-09-02 16:30:05

+0

对不起。你是对的。谢谢:) – 2014-09-02 16:40:37

+0

很高兴我可以帮助:) – Phrancis 2014-09-02 16:43:54