【问题标题】:TODATETIMEOFFSET inside a case statement案例语句中的 TODATETIMEOFFSET
【发布时间】:2014-09-02 16:09:10
【问题描述】:

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

SELECT AP.POR,
       AP.POD Path,
       TODATETIMEOFFSET(AP.StartTime, '-06:00') as StartTime,
       MinimumPrice = (
         CASE WHEN ( CHARINDEX('','' + '''+@Provider+''' + '','', '','' + '''+@UserCompanyList+''' + '','') > 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

我怎样才能使'as'语法在case语句中工作?

【问题讨论】:

  • 顺便说一句,你的括号比必要的多。虽然它们有时有助于提高可读性,但有时(例如您在 ELSE 子句周围的双括号)它们只会增加行噪音并损害可读性。将您的代码拆分为多行并考虑缩进将比额外的括号做更多的事情,以使复杂的 SQL 查询具有可读性和可维护性。

标签: sql datetimeoffset


【解决方案1】:

您的这部分查询似乎有错误:

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

AP.MinimumPrice 我希望是十进制类型,而 SQL 无法将十进制转换为 datetime2

此外,要在 case 语句中使用列别名,您可以将其放在最后一个逗号之前,例如:

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

【讨论】:

  • AP.MinimumPrice 类似于“2013-02-01 02:00:00.000 -06:00”。 TODATETIMEOFFSET(AP.StartTime, '-06:00') as StartTime, - 这部分工作正常,它返回类似于我上面所说的内容。唯一我无法弄清楚的是为什么这在 case 语句中不起作用。谢谢你的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多