【问题标题】:query for number of data within same shift查询同一班次内的数据个数
【发布时间】:2021-07-21 07:58:42
【问题描述】:

这是我在 Access 中的计时器表:

我正在尝试使用相同的 ShiftLog 和 ModelLog 获取 CTLog 的 COUNT。有两个班次:A 班是早上 7 点到下午 6.59 点(当天内),而 B 班是晚上 7 点到早上 6.59 点(直到第二天)。

使用 Shift A 获取 CTLog 的 COUNT 没有问题

select COUNT(*) AS total from timer where ShiftLog = @sl and TodayDate = @dtl and ModelLog = @m;
OleDbCommand cmd = new OleDbCommand(sql, connection);

cmd.Parameters.Add("@sl", OleDbType.VarWChar).Value = shiftlabel.Text;
cmd.Parameters.Add("@td", OleDbType.VarWChar).Value = DateTime.Now.ToShortDateString();
cmd.Parameters.Add("@m", OleDbType.VarWChar).Value = mlb.Text;

但是通过这种查询我无法获得Shift B的计数。当日期更改为第二天时如何查询Shift B的数据(包括12am之后的数据,从12:01am到6.59am )?

【问题讨论】:

  • 也许构建一个从和到的日期/时间。比如:ShiftLog = @s1 AND DateTimeLog BETWEEN @dt1 & " 19:00:00" AND @dt1 + 1 & " 6:00:00"
  • @June7 嗨,我找到了解决方案!

标签: c# sql winforms ms-access


【解决方案1】:

为 ShiftStart 和 ShiftEnd 创建新列并插入如下:

const string sql = @"INSERT INTO timer(DateTimeLog, ShiftLog, CTLog, WorkcellLog, ModelLog, StationLog, HourID, TodayDate, ShiftStart, ShiftEnd)VALUES(@d, @shift, @ct, @wc, @wm, @ws, @hid, @td, @ss, @se)";
OleDbCommand cmd = new OleDbCommand(sql, connection);

cmd.Parameters.Add("@d", OleDbType.Date).Value = d;
cmd.Parameters.Add("@shift", OleDbType.VarWChar).Value = shiftlb.Text;
cmd.Parameters.Add("@ct", OleDbType.VarWChar).Value = timerlb.Text;
cmd.Parameters.Add("@wc", OleDbType.VarWChar).Value = wclb.Text;
cmd.Parameters.Add("@wm", OleDbType.VarWChar).Value = mlb.Text;
cmd.Parameters.Add("@ws", OleDbType.VarWChar).Value = slb.Text;
cmd.Parameters.Add("@hid", OleDbType.VarWChar).Value = h;
cmd.Parameters.Add("@td", OleDbType.VarWChar).Value = today;
if (int.Parse(DateTime.Now.ToString("%H")) >= 7 && int.Parse(DateTime.Now.ToString("%H")) < 19) //Shift A
{
   cmd.Parameters.Add("@ss", OleDbType.VarWChar).Value = 7 + "&" + DateTime.Today.ToShortDateString();
   cmd.Parameters.Add("@se", OleDbType.VarWChar).Value = 1859 + "&" + DateTime.Today.ToShortDateString();
}
else if (int.Parse(DateTime.Now.ToString("%H")) >= 1 && int.Parse(DateTime.Now.ToString("%H")) < 7) //Shift B 1xxam to 659am
{
   cmd.Parameters.Add("@ss", OleDbType.VarWChar).Value = 19 + "&" + DateTime.Today.AddDays(-1).ToShortDateString();
   cmd.Parameters.Add("@se", OleDbType.VarWChar).Value = 659 + "&" + DateTime.Today.ToShortDateString();
}
   else if (int.Parse(DateTime.Now.ToString("%H")) >= 19 && int.Parse(DateTime.Now.ToString("%H")) <= 24) //Shift B 7xxpm to 12xxam
{
   cmd.Parameters.Add("@ss", OleDbType.VarWChar).Value = 19 + "&" + DateTime.Today.ToShortDateString();
   cmd.Parameters.Add("@se", OleDbType.VarWChar).Value = 659 + "&" + DateTime.Today.AddDays(1).ToShortDateString();
}

然后用类似的方法得到输出:

const string sql = @"SELECT COUNT(*) FROM timer WHERE  ShiftLog = @sl AND ShiftStart = @ss AND ShiftEnd = @se AND ModelLog = @m";
OleDbCommand cmd = new OleDbCommand(sql, connection);
    
cmd.Parameters.Add("@sl", OleDbType.VarWChar).Value = shiftlb.Text;    
if (int.Parse(DateTime.Now.ToString("%H")) >= 7 && int.Parse(DateTime.Now.ToString("%H")) < 19) //Shift A
    {
        cmd.Parameters.Add("@ss", OleDbType.VarWChar).Value = 7 + "&" + DateTime.Today.ToShortDateString();
        cmd.Parameters.Add("@se", OleDbType.VarWChar).Value = 1859 + "&" + DateTime.Today.ToShortDateString();
    }
else if (int.Parse(DateTime.Now.ToString("%H")) >= 1 && int.Parse(DateTime.Now.ToString("%H")) < 7) //Shift B 1xxam to 659am
    {
        cmd.Parameters.Add("@ss", OleDbType.VarWChar).Value = 19 + "&" + DateTime.Today.AddDays(-1).ToShortDateString();
        cmd.Parameters.Add("@se", OleDbType.VarWChar).Value = 659 + "&" + DateTime.Today.ToShortDateString();
    }
else if (int.Parse(DateTime.Now.ToString("%H")) >= 19 && int.Parse(DateTime.Now.ToString("%H")) <= 24) //Shift B 7xxpm to 12xxam
    {
        cmd.Parameters.Add("@ss", OleDbType.VarWChar).Value = 19 + "&" + DateTime.Today.ToShortDateString();
        cmd.Parameters.Add("@se", OleDbType.VarWChar).Value = 659 + "&" + DateTime.Today.AddDays(1).ToShortDateString();
    }
cmd.Parameters.Add("@m" ,OleDbType.VarWChar).Value = mlb.Text;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多