在SQL的结果中动态生成年龄(50分)

  • 主题发起人 主题发起人 combol
  • 开始时间 开始时间
C

combol

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库中已有职工的出生日期字段
如何在SQL结果生成的同时生成年龄
即在Dbgrid中显示如下:
姓名 性别 年龄 .....
张三 男 20
Select zhigong.xingmin,zhigong.xb _____?______ from "zhigong.db" zhigong where .........
 
在查询语句中用一参数(integer),查询前赋值(当年年份),计算生日时减一下.
 
类似这样的语句就可以,请核实在您的数据库服务器上面支持Year()和Now()函数
select zhigong.xingmin,zhigong.xb, (Year(Now()) - Year(zhigong.Birthday)) from "zhigong.db" zhigong where .........
 
不支持可以这样:
var year,m,d: word;
begin
DecodeDate(now,year,m,d);
with Query1do
begin
close;
SQL.Clear;
sql.Add('select zhigong.xingmin,zhigong.xb,'+IntToStr(year)+'-EXTRACT(YEAR FROM d) as aa from "zhigong.db" zhigong where .........');
open;
end;
 
呵呵, 我刚才在Access数据库上面试了一下,Year函数一般倒是都有的,
可是这个可笑的Year函数竟然不能直接作用在日期型的字段上面,必须像下面这样操作:
Year(Now())-DatePart("yyyy",[生日])
 
很正常, pegasus, 各个数据库对日期处理都各有一套(也就是说: 没有通用的方法)
ms sql日期处理都是用datediff(), (好象没有单独的year, month, day等等函数)
好象连ansi sql中的日期函数都不支持.
 
多谢eYes, 看来我自己也没有仔细研究SQL, 昨天还在一个对Sum字段的排序的问题中自诩呢!:)
It's never too old to learn! :)
 
如下写法已实现:
//Delphi &
Paradox7 环境下
//--------------------------
var
year,m,d: word;
now:Tdatetime;
begin

now:=date();
DecodeDate(now,year,m,d);
with Query1do
begin
close;
SQL.Clear;
sql.Add('select zhigong.xingmin,zhigong.xb,');
sql.add(''+IntToStr(year)+'-EXTRACT(YEAR FROM zhigong.csrq)
as 年龄 from "zhigong.db" zhigong where .........');
open;
end;
//-------------------
谢谢 Menxin :-)
另:其生成的结果中 年龄的字段宽度太大,很不美观,每次需人工调整.
Dbgrid显示如下:
姓名|性别|年龄 | |...
张三| 男 |20 | |...

 
接受答案了.
 
后退
顶部