以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  关于年龄的计算  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=173495)

--  作者:fvcfox
--  发布时间:2021/12/2 9:37:00
--  关于年龄的计算
请问下列代码怎样通过SQL后台实现,写到哪?
Dim tp As TimeSpan = Date.today - CDate(e.DataRow("出生日期"))
e.DataRow("年龄") = Math.Round(tp.TotalDays / 365.2422,2)

--  作者:有点蓝
--  发布时间:2021/12/2 9:47:00
--  
access
select int(datediff("d",出生日期,now())/365.25) as 年龄 from {表C}

SqlServer
select FLOOR(datediff(DY,出生日期,getdate())/365.25) as 年龄 from {表C}
--  作者:fvcfox
--  发布时间:2021/12/2 10:58:00
--  
我想用sqlreplace来做,代码有误,不知怎改
DataTables("员工信息").SQLReplaceFor("年龄",Select FLOOR(datediff(DY,出生日期,getdate())/365.25) As 年龄)
[此贴子已经被作者于2021/12/2 10:59:25编辑过]

--  作者:有点蓝
--  发布时间:2021/12/2 11:20:00
--  

DataTables("员工信息").SQLReplaceFor("年龄","FLOOR(datediff(DY,出生日期,getdate())/365.25)",true)

--  作者:fvcfox
--  发布时间:2021/12/2 11:28:00
--  
会出错

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20211202112700.png
图片点击可在新窗口打开查看

--  作者:fvcfox
--  发布时间:2021/12/2 11:35:00
--  
改成DataTables("员工信息").SQLReplaceFor("年龄","FLOOR(datediff(DY,出生日期,getdate())/365.25)",,True)可以计算了
--  作者:fvcfox
--  发布时间:2021/12/2 11:46:00
--  
但1964-03-02这日期e.DataRow("年龄") = Math.Round(tp.TotalDays / 365.2422,2)是58,而
DataTables("员工信息").SQLReplaceFor("年龄","FLOOR(datediff(DY,出生日期,getdate())/365.25)",,True)算出来的是57
从现在月份来看应该58才对
[此贴子已经被作者于2021/12/2 11:57:03编辑过]

--  作者:有点蓝
--  发布时间:2021/12/2 12:00:00
--  

[此贴子已经被作者于2021/12/2 12:00:19编辑过]

--  作者:有点蓝
--  发布时间:2021/12/2 12:04:00
--  
FLOOR是向下取整的,可以改为ROUND
--  作者:fvcfox
--  发布时间:2021/12/2 14:23:00
--  
改成
DataTables("员工信息").SQLReplaceFor("年龄","ROUND(datediff(DY,出生日期,getdate())/365.25,0)",,True)
后还是有问题
,1979-12-17 和 1979-11-16 计算的结果都是42,今天是12月2号,按道理不应该都是42,请问是什么问题
[此贴子已经被作者于2021/12/2 14:32:55编辑过]