编辑:
我想感谢@jimmix给了我一些开始写上一篇文章的想法,但不幸的是,我的文章被搁置了。由于缺乏细节。
但这是真实的场景,如果我没有很好地解释我的问题,我很抱歉。
从我的CSV文件中,我有一个原始数据,然后我将使用我的upload()函数上传到我的phpmyadmin数据库中,表名为"tbldumpbio",
查看下面的表结构:(Tbldumpbio)
在我的表tbldumpbio data中,我有一个名为processTimesheet()的函数。
代码如下:
public function processTimesheet(){
$this->load->model('dbquery');
$query = $this->db->query("SELECT * FROM tbldumpbio");
foreach ($query->result() as $row){
$dateTimeExplArr = explode(' ', $row->datetimex);
$dateStr = $dateTimeExplArr[0];
$timeStr = $dateTimeExplArr[1];
if($row->status='C/Out' and !isset($timeStr) || empty($timeStr) ){
$timeStrOut ='';
} else {
$timeStrOut = $dateTimeExplArr[1];
}
if($row->status='C/In' and !isset($timeStr) || empty($timeStr) ){
$timeStrIn ='';
} else {
$timeStrIn = $dateTimeExplArr[1];
}
$data = array(
'ID' => '',
'companyAccessID' => '',
'name' => $row->name,
'empCompID' => $row->empid,
'date' => $dateStr,
'timeIn' => $timeStrIn,
'timeOut' => $timeStrOut,
'status' => '',
'inputType' => ''
);
$this->dbquery->modInsertval('tblempbioupload',$data);
}
}
此函数会将另一个数据添加到另一个名为"tblempbioupload“的表中。但以下是我得到的结果:
请参考以下数据:(Tblempbioupload)
问题是:
如果状态为‘C/ In’,则应添加超时数据;如果状态为‘C/ duplicated
预期的结果应该是这样的:
发布于 2019-05-30 23:45:10
我看到的第一个问题是,您的时间表示为15:xx:yy PM,这是一个模棱两可的格式,因为您可以写成15:xx:yy AM,这将是无效的时间。
也就是说,如果您想要的是每次日期更改时都应该写入一行,则应该这样做:将前一个日期存储在变量中,然后当您移动到源表中的下一个记录时,将该日期与前一个日期进行比较,如果日期不同,则插入该行,否则只需读取下一位数据。
请记住,只有当您确定输入行的顺序正确时,这种方法才有效,这意味着首先按EmpCompId排序,然后按日期排序,然后按时间排序;如果不是这样,则此过程不能正常工作。
我可能会尝试另一种方法:如果(但从您的问题中不清楚)每个empcompid和date只有一行,我将在源表上进行分组查询,查找最小进入时间,另一个查找最大退出日期,并将它们用作insert查询的源。
https://stackoverflow.com/questions/56381042
复制相似问题