如何从日期时间数据库字段中选择最早的时间?

时间:2016-05-20 19:59:06

标签: c# visual-studio datetime ms-access-2007

我的数据库有一个表userIduserName,一个数字字段,用于保存每个日期时间的ID,以及一个日期时间字段,记录每次用户登录和注销时。

事情是,日志来自指纹捕获器,并且控制日志的软件未编程以避免重复日志。因此,用户每次都可以放下手指并保存登录/注销小时。

我的任务是创建一个程序,将日期时间字段的数据分成另一个数据库中的两个新日期时间字段,一个用于登录时间,另一个用于注销。为了达到这个目的,我必须使用ID字段为登录存储0值,为注销存储1到5,但我没有关于如何避免重复的想法。如果你能给我一个很好的暗示如何以平滑的方式实现分裂,那将是可爱的。

我必须使用ms acces 2007,visual studio 2012和c#语言。提前感谢您的关注。

PD:我来自哥伦比亚,这就是为什么我的英语有点凌乱和陈旧。

编辑:这是我的桌子的一个例子。

| ID用户|||||||| RecordTime ||||||||||||||||||||||||||||||||| RecordType |

| 399 --- |||||||| 28/04/2016 06:55:36 am ||||| ----- 0 ---------- | < / p>

| 399 --- |||||||| 28/04/2016 06:57:32 am ||||| ------ 0 ---------- |

| 399 --- |||||||| 28/04/2016 05:07:15 pm ||||| ------ 1 ---------- |

| 399 --- |||||||| 28/04/2016 05:16:33 pm ||||| ------ 1 ---------- |

| 399 --- |||||||| 02/05/2016 07:04:02 am ||||| ------ 0 ---------- |

| 399 --- |||||||| 02/05/2016 05:15:53 pm ||||| ------ 1 ---------- |

2 个答案:

答案 0 :(得分:0)

好吧,我不知道你的这个数据库有多大,而且每周/每天都可以做一个cron工作来将数据移植到新数据库中,但我会尝试解释一下我的解决方案的概念。由你来实现它。

我会使用以下方法:

  • 将一个用户的所有日志读入包含以下字段的数组中(如果数据太多,请在每次传递时选择日期时间范围
  • 对该数组进行排序       - &GT;这应该可以让你在RecordType中更改行(例如.0,2,0,1,0,5 ..
  • 然后将该数组( Chronologicaly!)写入具有唯一ID密钥的新数据库中。
  • 然后从旧数据库中删除此数据,以便不再将相同数据移植两次。
  • 每天/每周用cronjob运行。

由你来实现它。但这就是我将使用的策略。

然后你应该得到以下数据库:

ID ||||| ID用户所|||||||| RecordTime ||||||||||||||||||||||||||||||| || RecordType |

1|||||399---||||||||28/04/2016 06:55:36 a.m.|||||----- 0----------|

2|||||399---||||||||28/04/2016 06:57:32 a.m.|||||------0----------|

3|||||399---||||||||28/04/2016 05:07:15 p.m.|||||------1----------|

4|||||399---||||||||28/04/2016 05:16:33 p.m.|||||------1----------|

5|||||399---||||||||02/05/2016 07:04:02 a.m.|||||------0----------|

6|||||399---||||||||02/05/2016 05:15:53 p.m.|||||------1----------|

我希望这会有所帮助。

答案 1 :(得分:0)

首先,在没有正确识别的情况下从表中获取两种不同类型的数据的想法是错误的。不同类型的数据应始终位于不同的表中。 我的老板(我不知道怎么做)导致在编程方式上得到了很好的说明,他在澄清了他的需求之后,给了我一种方法来使这个解决方案起作用:

首先,你拿表,用它来填充任何类型的数组,在我的例子中,是一个DataGridView:

try
        {
            huella.Open();
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = huella;
            string consulta = "select [User].IdUser,[User].IdentificationNumber,[User].name,[Record].RecordTime," +
                "[Record].RecordType from [User] inner join [Record] on [User].IdUser = [Record].IdUser " +

            "where " + "[Record].IdUser=@01 and [Record].RecordTime between @time1 and @time2 order by [User].IdUser asc,[Record].RecordTime asc";
            comando.CommandText = consulta;
            comando.Parameters.AddWithValue("@01", IDcm.Text.ToString());
            comando.Parameters.AddWithValue("@time1", dateTimePicker1.Value.Date);
            comando.Parameters.AddWithValue("@time2", dateTimePicker2.Value.Date);
            OleDbDataAdapter datos = new OleDbDataAdapter(comando);
            // using( OleDbDataReader lector = comando.ExecuteReader())
            tabla = new DataTable();
            datos.Fill(tabla);
            //MessageBox.Show(""+tabla);
            clu.DataSource = tabla;
        }
        catch (Exception ex)
        {
            MessageBox.Show("ERROR " + ex);
        }
        finally
        {
            huella.Close();
        }

然后,循环遍历数组的数据,将数组的第一个值赋给变量。在这个循环中,你开始另一个循环,将数组的第二个值分配给另一个变量,最后,你比较这两个变量,将它们分配到各自的位置(按照你自己的标准):

StreamWriter archivo = new StreamWriter("D:\\MAXIMUM PC.csv", true);
        {
            archivo.WriteLine('"' + "usuario" + '"' + ";" + '"' + "Hora de entrada" + '"' + ";" + '"' + "Hora de salida" + '"' + ";" + '"' + "Tiempo" + '"' + ";" + '"' + "Pago" + '"');
            for (i = 0; i < rows; i++)
            {
                //assign the first variable, in my case, DateTime data types
                fechaHora = Convert.ToDateTime(clu.Rows[i].Cells[0].Value.ToString());
                for (j = i + 1; j < rows; j++)
                {
                    //assign the second variable
                    fechaActual = Convert.ToDateTime(clu.Rows[j].Cells[0].Value.ToString());
                    if (fechaHora.Date == fechaActual.Date)
                    {

                        //here i start the compare process
                        if (fechaHora.TimeOfDay != fechaActual.TimeOfDay)
                        {
                            tiempo = fechaActual.Subtract(fechaHora);
                            // if the dates are the same, but their time is different..
                            if (tiempo.TotalHours > 7 && fechaHora.TimeOfDay > fechaActual.TimeOfDay)
                            {
                                //if the timespan between the times is over 7 hours and the first date is over the second....
                                entrada = fechaHora;
                                salida = fechaActual;
                                pay = Convert.ToDouble(tiempo.TotalHours * hourPay);
                                archivo.WriteLine(usuario + ";" + entrada + ";" + salida + ";" + tiempo.TotalHours + ";" + pay);

                            }
                            //if the timespan between the times is over 7 hours and the second date is over the fist....
                            else if (tiempo.TotalHours > 7 && fechaHora.TimeOfDay < fechaActual.TimeOfDay)
                            {
                                entrada = fechaHora;
                                salida = fechaActual;
                                pay = Convert.ToDouble(tiempo.TotalHours * hourPay);
                                archivo.WriteLine(usuario + ";" + entrada + ";" + salida + ";" + tiempo.TotalHours + ";" + pay);
                            }
                            //if the timespan between the times is under 2 hours and the first date is under or equal the second....
                            else if (tiempo.TotalHours < 2 && fechaHora.TimeOfDay <= fechaActual.TimeOfDay)
                            {
                                error = fechaActual;

                            }
                        }
                    }
                }
            }
        }

感谢您的帮助,我希望这会有用。