【问题标题】:Query to compare cast in select statement查询以比较 select 语句中的演员表
【发布时间】:2016-01-18 04:07:19
【问题描述】:

我有一个查询,我在其中提取三个字段,并将它们转换为日期。我希望然后在同一个 select 语句中运行比较,但是我在尝试比较的字段上得到一个无效的列名。不过,order by 工作正常。 /scratching_head

SQL Server 2012

SELECT 
UTCSID,
UTLCID,

/* put utonmm, utondd, utonyy together as a date called uton */
CAST(
  CAST(UTONMM as varchar) + '/' + 
  CAST(UTONDD as varchar) + '/' +
  CASE WHEN UTONCV = '1' 
    THEN RIGHT('20' + CONVERT(varchar(4), RIGHT('00' + CONVERT(varchar(4), UTONYY),2)),4)
  ELSE RIGHT('19' + CONVERT(varchar(4), UTONYY),4)
  END 
AS DATETIME) AS UTON, 

/* put utofmm, utofdd, utofyy together as a date called utoff */
CAST(
CASE WHEN UTOFMM > '0' 
THEN
    CAST(UTOFMM as varchar) + '/' + 
    CAST(UTOFDD as varchar) + '/' +
    CASE WHEN UTOFCV = '1' 
        THEN RIGHT('20' + CONVERT(varchar(4), RIGHT('00' + CONVERT(varchar(4), UTOFYY),2)),4)
        ELSE RIGHT('19' + CONVERT(varchar(4), UTOFYY),4)
    END
END
AS DATETIME) AS UTOFF,

UTCBAL,
UTDBAL,
UTUNPS

FROM [HTEDTA].[THOR].[HTEDTA].UT210AP
WHERE UTLCID = '885570' AND UTOFF > GETDATE() ORDER BY UTON DESC

此语句返回:

Invalid column name: 'UTOFF'

【问题讨论】:

  • 我不认为您可以将结果作为列进行比较,即使它似乎以这种方式解决。我知道这样做的唯一方法是使这整个事物成为派生表,并对其进行查询。 (将其包装在另一个 SELECT 语句中。)

标签: sql sql-server tsql date casting


【解决方案1】:

问题是在解析where 子句时,别名utoff 是未知的。

解决此问题的一种方法是将查询包装在公用表表达式中,并对其应用where 子句:

WITH CTE AS (
    SELECT UTCSID, UTLCID,    
    /* put utonmm, utondd, utonyy together as a date called uton */
    CAST(
     CAST(UTONMM as varchar) + '/' + 
     CAST(UTONDD as varchar) + '/' +
     CASE WHEN UTONCV = '1' 
       THEN RIGHT('20' + CONVERT(varchar(4), RIGHT('00' + CONVERT(varchar(4), UTONYY),2)),4)
     ELSE RIGHT('19' + CONVERT(varchar(4), UTONYY),4)
     END 
    AS DATETIME) AS UTON, 

    /* put utofmm, utofdd, utofyy together as a date called utoff */
    CAST(
    CASE WHEN UTOFMM > '0' 
    THEN
       CAST(UTOFMM as varchar) + '/' + 
       CAST(UTOFDD as varchar) + '/' +
       CASE WHEN UTOFCV = '1' 
          THEN RIGHT('20' + CONVERT(varchar(4), RIGHT('00' + CONVERT(varchar(4), UTOFYY),2)),4)
          ELSE RIGHT('19' + CONVERT(varchar(4), UTOFYY),4)
       END
    END
    AS DATETIME) AS UTOFF,

    UTCBAL, UTDBAL, UTUNPS    
    FROM [HTEDTA].[THOR].[HTEDTA].UT210AP
)
SELECT * 
FROM CTE
WHERE UTLCID = '885570' AND UTOFF > GETDATE() 

【讨论】:

  • 那应该很好用。 CTE 存储在 TempDB 中,然后在查询结束时销毁?
  • @MikeAndrews 是的,这是一个临时结果集,在执行查询后会消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2012-12-23
  • 2012-01-19
  • 2019-08-30
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多