ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Text:='select datediff(dd,TASK_STIME,TASK_ETIME) as day from MSN_TASK where TASK_NUM = :p1'; // TASK_STIME,TASK_ETIME为数据库表中对应的开始和结束时间的名称,MSN_TASK为表名 ADOQuery1.Parameters.Items[0].Value := TaskN; ADOQuery1.Open; Combo_Day.Text:=ADOQuery1.Fields[0].AsString;//将得到的日的差放进编辑框 这样编,编译后出来的结果还是不对啊,我是不是哪没写对啊,大家帮我看看吧
返回两个日期之间的时间间隔。
语法
DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]])
DateDiff 函数的语法有以下参数:参数 描述
interval 必选。字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。
date1, date2 必选。日期表达式。用于计算的两个日期。
firstdayofweek 可选。指定星期中第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。
firstweekofyear 可选。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。
设置
interval 参数可以有以下值:
设置 描述
yyyy 年
q 季度
m 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 小时
m 分钟
s 秒 在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。
从数据库里取出来后,在程序里操作
比如
var
d1, d2 :TDateTime;
yy, mm, dd :Word; d1 := xxx.fieldbyName('startdate').asDateTime;
d2 := xxx.fieldbyName('enddate').asDateTime;
decodedate(d2-d1, yy, mm, dd);
例如:SELECT DATEDIFF(yyyy, '2020-6-2 9:00:00', '2006-6-2 9:00:00') AS year
得到的结果就是-14
SELECT DATEDIFF(mm, '2020-6-2 9:00:00', '2006-6-2 9:00:00') AS month
得到的结果就是-168SELECT DATEDIFF(yyyy, 开始时间, 结束时间) AS year,DATEDIFF(mm, 开始时间, 结束时间) AS month,DATEDIFF(dd, 开始时间, 结束时间) as day from 表名作为一个整体来计算的方法
select DATEPART(month, '2020-6-2 9:00:00')-DATEPART(month, '2006-6-2 9:00:00')
得到的结果就是0
-----------------
stryy := IntToStr(yy);我用的数据库是sqlserver,
----------------------
sqlserver可以用DATEDIFF函数还有个要求就是相减得到的不足十的值前面要有0,比如得到6,要写为06
---------------------
strmm := Copy('0'+IntToStr(mm), 1, 2);
或者用Format
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='select datediff(dd,TASK_STIME,TASK_ETIME) as day from MSN_TASK where TASK_NUM = :p1'; // TASK_STIME,TASK_ETIME为数据库表中对应的开始和结束时间的名称,MSN_TASK为表名
ADOQuery1.Parameters.Items[0].Value := TaskN;
ADOQuery1.Open;
Combo_Day.Text:=ADOQuery1.Fields[0].AsString;//将得到的日的差放进编辑框
这样编,编译后出来的结果还是不对啊,我是不是哪没写对啊,大家帮我看看吧