我想在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时它没有显示任何内容。告诉我最后年龄的所有人,我找到了这些年龄段的人。
有人可以帮我解决这个问题吗? 非常感谢你提前。
答案 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
;
答案 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