在MSSQL上用AS编写查询

时间:2014-08-26 07:25:18

标签: sql sql-server

我想在Microsoft SQL Server Management Studio上键入查询,但我发现了一些问题。

在我的查询中,我想在我的请求中创建一个临时列,用于给出personn的年龄。所以我输入了这个,[DANAID]是人物的诞生日期(yyyy / mm / dd hh:mm:ss.sss):

SELECT TOP 1000
[All my columns]
, YEAR([DANAID])-YEAR(GETDATE()) AS AGE
FROM [table].[PERSONNE]
WHERE AGE <> NULL AND (AGE >= 25 AND AGE <= 50)

在此之后,我在MSSQL中收到错误,我无法执行请求。我得到三个错误,其中每个AGE在where函数中有一个错误。

在做了一些研究后,我发现了DATEDIFF函数,所以我编辑了这样的代码:

SELECT TOP 1000
[All my columns]
, DATEDIFF(year,[DANAID],GETDATE()) AS AGE /* No error */
FROM [table].[PERSONNE]
WHERE AGE <> NULL AND (AGE >= 25 AND AGE <= 50) /* Three errors */

但我显然仍然有相同的错误消息,上面写着&#34;列名无效&#34; AGE&#34;&#34;在这两个。因此,在AGE之后,我尝试将其命名为[AGE],然后通过在stackoverflow上进行一些搜索,我称之为“AGE”#39;到处都是这样。

SELECT TOP 1000
[All my columns]
, DATEDIFF(year,[DANAID],GETDATE()) AS 'AGE' /* No error */
FROM [table].[PERSONNE]
WHERE 'AGE' <> NULL AND ('AGE' >= 25 AND 'AGE' <= 50) /* No error */

但是当我执行我的请求时,尽管有一些年龄在25到50岁之间的人,但我没有得到任何结果。我首先替换了&lt;&gt; by!=,然后试图削减年龄&#39; &LT;&GT; NULL但是在用ORDER BY&#39; AGE&#39;替换WHERE时它没有显示任何内容。告诉我最后年龄的所有人,我找到了这些年龄段的人。

有人可以帮我解决这个问题吗? 非常感谢你提前。

3 个答案:

答案 0 :(得分:1)

编辑:将您的计算反转为年份(GETDATE()) - 年份([DANAID])

在查询中有两种方法可以访问column alias AGE。首先是&#34;嵌套&#34;原文:

SELECT TOP 1000
      *
    , AGE
FROM (
            SELECT
                  *
                , YEAR(GETDATE()) - YEAR([DANAID]) AS AGE
            FROM [table].[PERSONNE]
      ) AS derived
WHERE AGE BETWEEN 25 AND 50
ORDER BY
      "some fields here"
;

或使用交叉申请

SELECT TOP 1000
      *
    , CA.AGE
FROM [table].[PERSONNE]
      CROSS APPLY (
                  SELECT YEAR(GETDATE()) - YEAR([DANAID])
            ) CA (AGE)
WHERE CA.AGE BETWEEN 25 AND 50
ORDER BY
      "some fields here"
;

对于你的where子句,你可以使用BETWEEN,如果AGE在25到50之间,它也不能为NULL,因此没有必要明确排除这些。

编辑:但是可以在查询中包含WHERE [PERSONNE].[DANAID] IS NOT NULL,这将排除任何会产生NULL AGE的记录


但是有一个问题没有解决。这不是计算年龄的准确方法。如果日期的月份在getdate()月之后,则年龄比当前结果小1年。例如如果在12月出生,则每年1月份的年龄不会超过1岁。

更准确的年龄计算方法:

SELECT TOP 1000
      ID
    , CA.*
FROM [PERSONNE]
      CROSS APPLY (
                  SELECT YEAR(GETDATE()) - YEAR([DANAID])

                  , YEAR(getdate()) - YEAR(DANAID)
                    - ( CASE
                           WHEN MONTH(DANAID) > MONTH(getdate())
                             OR ( MONTH(DANAID) = MONTH(getdate())
                                AND DAY(DANAID) > DAY(getdate())
                                )
                           THEN 1
                           ELSE 0
                         END )

            ) CA (AGEsimple, AGEaccurate)

WHERE CA.AGEaccurate BETWEEN 25 AND 50
ORDER BY
      ID
;

See this SQLfiddle Demo

答案 1 :(得分:0)

试试这个

SELECT  t.*
FROM    ( SELECT TOP 1000
                [All my columns] ,
                DATEDIFF(year, [DANAID], GETDATE()) AS 'AGE' /* No error */
          FROM      [table].[PERSONNE]
        ) AS t
WHERE   t.AGE IS NOT NULL
       AND ( t.AGE >= 25
          AND t.AGE <= 50
        )

答案 2 :(得分:-1)

SELECT * FROM 
(
SELECT TOP 1000
[All my columns]
, DATEDIFF(year,[DANAID],GETDATE()) AS [age] /* No error */
FROM [table].[PERSONNE]
) AS T
WHERE NOT [age] IS NULL AND ([age] >= 25 AND [age] <= 50) /* No error */
select子句中的

字段在查询的所有部分后计算! 好的,这个代码

 SELECT TOP 1000
    [All my columns]
    , DATEDIFF(year,[DANAID],GETDATE()) AS [age] /* No error */
    FROM [table].[PERSONNE]
 WHERE NOT DATEDIFF(year,[DANAID],GETDATE()) IS NULL AND DATEDIFF(year,[DANAID],GETDATE()) BETWEEN 25 AND 50