C# 获取系统日期当前小时的数据计数

C# 获取系统日期当前小时的数据计数,c#,sql,winforms,ms-access,C#,Sql,Winforms,Ms Access,我在Access中有一个数据表 DateTimeLog具有日期/时间数据类型,而其他数据类型为字符串 我需要使用指定的ModelLog获取系统日期最后一小时的数据行总数。但我想不出使用MS Access的查询的正确结构,因为我对MS Access非常陌生 下面显示了如何插入数据: DateTime now = DateTime.Now; var today = now.ToString("g"); DateTime d = DateTime.Parse(today

我在Access中有一个数据表 DateTimeLog具有日期/时间数据类型,而其他数据类型为字符串

我需要使用指定的ModelLog获取系统日期最后一小时的数据行总数。但我想不出使用MS Access的查询的正确结构,因为我对MS Access非常陌生

下面显示了如何插入数据:

  DateTime now = DateTime.Now;
  var today = now.ToString("g");
  DateTime d = DateTime.Parse(today);

  const string sql = @"INSERT INTO timer(DateTimeLog, ShiftLog, CTLog, WorkcellLog, ModelLog, StationLog)VALUES(@d, @shift, @ct, @wc, @wm, @ws)";
        OleDbCommand cmd = new OleDbCommand(sql, connection);

        cmd.Parameters.Add("@d", OleDbType.DBTimeStamp).Value = d;
        cmd.Parameters.Add("@shift", OleDbType.VarChar).Value = shiftlb.Text;
        cmd.Parameters.Add("@ct", OleDbType.VarChar).Value = timerlb.Text;
        cmd.Parameters.Add("@wc", OleDbType.VarChar).Value = wclb.Text;
        cmd.Parameters.Add("@wm", OleDbType.VarChar).Value = mlb.Text;
        cmd.Parameters.Add("@ws", OleDbType.VarChar).Value = slb.Text;

try
{}
catch(exception e)
{}

好的,您清楚地知道如何使用参数运行数据库查询,您只需要以ExecuteScalar的形式运行此查询,将结果转换为int

SELECT COUNT(*) FROM timer WHERE dateTimeLog >= @d
然后将d参数设置为一小时前

cmd.Parameters.Add("@d", OleDbType.Date).Value = DateTime.Now.AddHours(-1);
旁注:我建议不要通过字符串进行往返,只是为了缩短一次的秒数。相反,请考虑:

var d = DateTime.Now;
d = d.AddTicks( -(d.Ticks % (60*TimeSpan.TicksPerSecond)));
或许

var d = DateTime.Now;
d = d.AddMilliseconds(-d.Milliseconds).AddSeconds(-d.Seconds);

我找到了在同一小时内获取数据数量的另一种方法。创建两个新列,HourID和TodayDate分别表示24小时格式的当前小时和今天的日期。相应地插入数据

正在获取数据计数:

const string sql = @"SELECT COUNT(*) FROM timer WHERE HourID = @h AND TodayDate = @td AND ModelLog = @m";
        OleDbCommand cmd = new OleDbCommand(sql, connection);

        cmd.Parameters.Add("@h", OleDbType.VarWChar).Value = DateTime.Now.ToString("%H");
        cmd.Parameters.Add("@td", OleDbType.VarWChar).Value = DateTime.Now.ToShortDateString();
        cmd.Parameters.Add("@m", OleDbType.VarWChar).Value = mlb.Text;

日期/时间可以是var dtm=DateTime.Now.Date.AddHoursDateTime.Now.Hour-1;最后再加上几分钟。您是否有一个已经尝试从数据库中获取行的查询?是否使用命令参数将值传递给查询?假设您使用的是OleDb,则需要两个参数,一个为OleDbType.Date类型,另一个为OleDbType.VarWChar类型。还是ODBC?-发布你的代码。@Jimi你好。我编辑了这本书question@Jimi使用指定的ModelLog获取数据没有问题。但是我不能得到当前的日期。我尝试在where子句中使用DateTime today=DateTime.today和FormatDateTimeLog,Short Date=today,但它不起作用。我还尝试将DateTimeLog的列分离为DateLog和TimeLog,但我无法仅插入时间,因为AccessOleDbType中的DateTime.DBTimeStamp不是您的格式。这是日期文字的ISO格式。Unicode字符串需要OleDbType.Date和OleDbType.VarWChar,请参见此处。-您显示的查询是插入查询,而不是选择查询,而您的问题是我需要获取数据行的总数。[…],获取,而不是设置。另外,您还引用了两个参数,一个日期/时间>=特定日期和一个文本列+一个计数函数。澄清。@Jimi当然问题是关于选择。我显示的插入查询是为了让您知道我使用了参数来进行插入。是的,查询类似于countid from timer,其中id在select id from timer where date/time=now和ModelLog=mlb.Text中,但显然这个查询是错误的,这是我对查询的想法。我尝试了您的代码,但在条件表达式中得到了数据类型不匹配。我想展示我是如何做到的,我是否应该编辑有问题的内容或修复错误。我删除了ifcmd.ExecuteNonQuery>0,现在它可以工作了。感谢您提供的帮助。您需要使用ExecuteScalar来检索计数,而不是ExecuteOnQuerySide备注。安装SQL Express并使用它而不是Access,这会给您带来很多好处。是的,您是对的。由于公司的某些原因,我被迫使用Access