在users
表中我有birth_date
列。我只想选择 18 岁以下的用户。
我尝试使用别名
select
*,
age = case
when datediff(year, getdate(), birth_date) > 0
then year(getdate()) - year(birth_date) - 1
else year(getdate()) - year(birth_date)
end
from
users
where
age < 18
但显然我不能在哪里使用别名。
所以我尝试使用案例,但它也行不通
select *
from users
where
case
when datediff(year, getdate(), birth_date) > 0
then year(getdate()) - year(birth_date) - 1 < 18
else year(getdate()) - year(birth_date) < 18
在这种情况下我该怎么办?我不想使用存盘程序。
uj5u.com热心网友回复:
利用 cte
WITH cte AS
(
SELECT *,
CASE
WHEN DATEDIFF(year, getdate(), birth_date) > 0
THEN year(getdate()) - year(birth_date) - 1
ELSE year(getdate()) - year(birth_date)
END AS age
FROM users
)
SELECT *
FROM cte
WHERE age < 18
db<>fiddle 中的演示
uj5u.com热心网友回复:
这样做的正确方法是根本不使用DATEDIFF
。它会不太准确(因为它使用日期边界)并且更慢(它不能使用索引)。
而是DATEADD
针对当前日期使用,不要针对列使用函式
SELECT *
FROM dbo.users
WHERE birth_date > DATEADD(year, -18, GETUTCDATE())
db<>小提琴
uj5u.com热心网友回复:
简单用这个!
SELECT * FROM dbo.users WHERE DATEDIFF(day,birth_date,GETDATE()) < 6570
uj5u.com热心网友回复:
我认为您只是在寻找有关如何在列中使用别名/CASE 陈述句的方向?
如果这是正确的,那么你只需要用括号括起来你的别名。
select *
,case
when datediff(year, getdate(), birth_date) > 0
then year(getdate()) - year(birth_date) - 1
else year(getdate()) - year(birth_date)
end as age
from users
where age < 18
uj5u.com热心网友回复:
以下是计算闰日和其他复杂性的年龄的一种方法。这将计算 yyyymmdd 整数值的差异,然后除以 10000 以仅评估年份差异。
SELECT *
FROM users
WHERE
(CAST(FORMAT(GETDATE(), 'yyyyMMdd') AS int) -
CAST(FORMAT(birth_date, 'yyyyMMdd') AS int)) / 10000 < 18;
0 评论