Sql 查询以比较select语句中的强制转换

Sql 查询以比较select语句中的强制转换,sql,sql-server,tsql,date,casting,Sql,Sql Server,Tsql,Date,Casting,我有一个查询,我在其中拉入三个字段,并将它们转换为日期。我希望在同一个select语句中运行比较,但是我在尝试比较的字段上得到一个无效的列名。不过,order by工作正常/搔头 SQL Server 2012 SELECT UTCSID, UTLCID, /* put utonmm, utondd, utonyy together as a date called uton */ CAST( CAST(UTONMM as varchar) + '/' + CAST(UTONDD

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

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'

问题是在解析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() 

我不认为您可以将结果作为列进行比较,即使它看起来是这样解决的。我所知道的唯一方法是将整个过程作为一个派生表,并查询它。用另一个SELECT语句包装它。这应该很好用。CTE存储在TempDB中,然后在查询结束时销毁?@MikeAndrews是的,它是一个临时结果集,在执行查询后消失。