将自定义查询值从一个插入到另一个,以及单独的相应字段

时间:2012-04-23 17:22:39

标签: sql tsql sql-server-2005

我有一个表时间,有4个不同的时间字段,即:intime,outtime,lunchout,lunchin。我试图找到记录的总小时数,((停工时间) - (午餐 - 午餐)。我可以成功使用:

select convert (varchar(10),((outtime_d - intime_a)-(lunchin_c - lunchout_b)),8) as time1 from timings where fname = 'abc'

create table timings
(
fname varchar(max),
fid varchar(30) PRIMARY KEY CLUSTERED,
intime_a datetime,
outtime_d datetime,
lunchout_b datetime,
lunchin_c datetime
)

insert into timings values('Abc','4C00A2C82A0C','4/23/2012 2:07:51 PM','4/23/2012 9:07:51 PM','4/23/2012 4:12:51 PM','4/23/2012 5:07:51 PM')
time1 = 06:05:00

我还有一个名为出勤的表,其中包含以下字段:fname,presenttime,date。

create attendance timings
(
fname varchar(max),
presenttime datetime,
date datetime
)

我需要插入参加者:

fname:来自时间的fname

presenttime:time1 - 上面列出的查询的结果

日期:当前系统日期。 (只有日期,而不是时间,需要从getdate()函数中删除时间戳)

我首先尝试使用datediff函数,并且后期连接值,但是我的结果不正确。

SELECT ROUND(cast((datediff(hh, outtime_d ,intime_a) / 60.0) as FLOAT),2) AS DiffHour from timings where fname = 'abc'
SELECT ROUND(cast((datediff(mi, outtime_d ,intime_a) / 60.0) as FLOAT),2) AS DiffMinute from timings where fname = 'abc'
SELECT ROUND(cast((datediff(ss, outtime_d ,intime_a) / 60.0) as FLOAT),2) AS DiffSec from timings where fname = 'abc'

由于

2 个答案:

答案 0 :(得分:0)

你正在使它变得更加复杂。使用DATEDIFF时无需转换或分割。以下是查看DATEDIFF如何运作的链接。

尝试使用以下代码:

SELECT DATEDIFF(hh,outtime_d,intime_a)AS来自fname ='abc'的时间的DiffHour

SELECT DATEDIFF(mi,outtime_d,intime_a)AS DiffMinute来自fname ='abc'的时间

SELECT DATEDIFF(ss,outtime_d,intime_a)AS DiffSec来自fname ='abc'的时间

如果您尝试在现场时间内保存小时,分钟和秒钟,则无效。如果您要查找包含小时,分钟和日期数据的一个字段,则应使用TimeSpan数据类型。

答案 1 :(得分:0)

我最终将字段的数据类型更改为varchar

并使用了这个:

insert into attendance(fname,presenttime,date)
SELECT 
fname, 
CAST(CONVERT (VARCHAR(10),((outtime_d - intime_a)-(lunchin_c - lunchout_b)),8) AS varchar(10)),
CONVERT (VARCHAR(10),getdate(),3)
FROM timings WHERE fname = 'abc'

目前结果令人满意。