2017-01-16 37 views
1

这是我的表格。在DataGridView的不同行中显示datetime的值

attendance 
empID   int(11) 
time_stamp  datetime 
in_out   char(3)  *determines in/out of employee 
am_pm   char(2)  *determines if morning/afternoon shift 

下图显示了我想要的输出结果。我需要将datetime数据类型的time_stamp的值显示在vb.net的DataGrid中。

我知道如何使用date_format。我只是不知道如何选择数据,让它们以这种方式显示。

数据库输入

empID | time_stamp   | in_out | am_pm 
    152 | 2016-01-01 12:00:00 | out  | am 
    152 | 2016-01-01 08:00:00 | in  | am 
    152 | 2016-01-02 12:00:00 | out  | am 
    152 | 2016-01-02 08:00:00 | in  | am 
    152 | 2016-01-03 12:00:00 | out  | am 
    152 | 2016-01-03 08:00:00 | in  | am 
    152 | 2016-01-01 05:00:00 | out  | pm 
    152 | 2016-01-01 01:00:00 | in  | pm 
    152 | 2016-01-02 05:00:00 | out  | pm 
    152 | 2016-01-02 01:00:00 | in  | pm 
    152 | 2016-01-03 05:00:00 | out  | pm 
    152 | 2016-01-03 01:00:00 | in  | pm 

员工所需输出152

DAY |  AM   |  PM   | 
1 | 8:00:00 12:00:00 | 1:00:00 5:00:00 | 
2 | 8:00:00 12:00:00 | 1:00:00 5:00:00 | 
3 | 8:00:00 12:00:00 | 1:00:00 5:00:00 | 

hard copy of the daily time record

+0

我建议您在内存中的临时DataTable,并使用循环来从你的SELECT查询的结果来填充它。尽管可以在SQL中转置数据等,但我怀疑你会发现在VB代码中转换数据要容易得多 – SSS

+0

此外,您可能要考虑将多个DataGridView用于UI显示。 – InteXX

回答

1

您可以使用这样的查询:

SELECT empID, emp_day, MAX(am_in1) as am_in, MAX(am_out1) as am_out, MAX(pm_in1) as pm_in, MAX(pm_out1) as pm_out 
FROM (
SELECT empID, DATE_FORMAT(`time_stamp`,'%e') as emp_day, 
CASE WHEN am_pm='am' AND in_out='in' THEN DATE_FORMAT(`time_stamp`,'%T') ELSE '' END as am_in1, 
CASE WHEN am_pm='am' AND in_out='out' THEN DATE_FORMAT(`time_stamp`,'%T') ELSE '' END as am_out1, 
CASE WHEN am_pm='pm' AND in_out='in' THEN DATE_FORMAT(`time_stamp`,'%T') ELSE '' END as pm_in1, 
CASE WHEN am_pm='pm' AND in_out='out' THEN DATE_FORMAT(`time_stamp`,'%T') ELSE '' END as pm_out1 
FROM attendance 
) as o 
GROUP BY empID, emp_day 

的SUBQ uery将所需列和主要查询组格式化为每位员工每天获得一行。

编辑:here is a fiddle

+0

非常感谢你@moni_dragu。这正是我想要做的! – oozmac

+0

我想知道是否可以保留整个月份的日期,即使没有记录和登录记录?就像1月份一样,**日**列必须填写1到31.我应该为DATE制作另一张表吗?再次感谢你。 – oozmac

+0

你有更多的选择来做到这一点。正如你所说,你可以为日期建立一个单独的表格,并将它与上面的子查询结合起来。或者你可以在你的vb.net代码中处理缺失的日子。 –

相关问题