【问题标题】:Error Programmatically Converting Set DateTime以编程方式转换设置日期时间时出错
【发布时间】:2018-01-01 23:49:45
【问题描述】:

我有一个方法可以从名为AuditActivity 的表中实际获取count,它需要今天的开始时间和今天的结束时间,分别为 00:00:00 和 23:59:59 以及另一个健康)状况。 datetime 范围。

例如,今天的日期 26/07/17,我想在 where 条件中指定 DateTimeActivity 仅在 between 26/07/17 00:00 时取 count: 00 和 26/07/17 23:59:59。

我知道我的编码实际上是错误的,但我似乎无法正确编码。

我目前正在将 nvarchar 转换为 datetime 这是错误的..

额外信息:datatype for DateTimeActivity 在我的database 中是datetime

以及上面提到的字段值示例:'26/07/2017 22:43:06'

//Wrong
//Get Number of Logins today from AuditActivity
public int countLoginsToday()
{
    int count = 0;

    StringBuilder sqlCmd = new StringBuilder();
    sqlCmd.AppendLine("SELECT COUNT(*) FROM AuditActivity WHERE DateTimeActivity BETWEEN @getStartOfDay AND @getEndOfDay AND ActivityType = @getType");

    //Date Today
    String todayDate = DateTime.Now.Date.ToString();

    //Time Start
    String timeStart = "00:00:00";

    //Time End
    String timeEnd = "23:59:59";

    try
    {
        SqlConnection myConn = new SqlConnection(DBConnectionStr);

        myConn.Open();

        SqlCommand cmd = new SqlCommand(sqlCmd.ToString(), myConn);

        cmd.Parameters.AddWithValue("@getStartOfDay", Convert.ToDateTime(todayDate + " " + timeStart));
        cmd.Parameters.AddWithValue("@getEndOfDay", Convert.ToDateTime(todayDate + " " + timeEnd));
        cmd.Parameters.AddWithValue("@getType", "Login");

        count = Convert.ToInt16(cmd.ExecuteScalar());

        myConn.Close();

        return count;
    }
    catch (SqlException ex)
    {
        logManager log = new logManager();
        log.addLog("AuditNLoggingDAO.getLoginsToday", sqlCmd.ToString(), ex);
        return 0;
    }
}

我得到的错误:

非常感谢任何帮助!谢谢!

【问题讨论】:

  • 我猜问题是todayDate 的值是"07/26/2017 00:00:00",然后你传递给Convert.ToDateTime() 的值最终会是"07/26/2017 00:00:00 00:00:00"。正如其他人所指出的,一直使用DateTime,不要使用字符串。
  • 同意。使用建议的答案之一将为您解决这个问题。

标签: c# asp.net string datetime type-conversion


【解决方案1】:

你得到错误是因为

todayDate + " " + timeStart

最终会变成

26/07/17 00:00:00 00:00:00

这不是要转换的有效日期时间。

你可以如下构造时间

//Time Start
var timeStart = DateTime.Today; // 26/07/17 00:00:00

//Time End
var timeEnd = timeStart.AddDays(1).AddSeconds(-1); // 26/07/17 23:59:59

并按原样将它们添加到查询中

cmd.Parameters.AddWithValue("@getStartOfDay", timeStart);
cmd.Parameters.AddWithValue("@getEndOfDay", timeEnd);

【讨论】:

    【解决方案2】:

    这是一个你可以使用的食谱

    cmd.Parameters.AddWithValue("@getStartOfDay", DateTime.Today);
    cmd.Parameters.AddWithValue("@getEndOfDay", DateTime.Today.AddDays(1).AddSeconds(-1));
    

    或者你可以改变你的查询

    sqlCmd.AppendLine("SELECT COUNT(*) FROM AuditActivity WHERE DateTimeActivity >= @getStartOfDay AND DateTimeActivity < @getEndOfDay AND ActivityType = @getType");
    /*....*/
    
    cmd.Parameters.AddWithValue("@getStartOfDay", DateTime.Today);
    cmd.Parameters.AddWithValue("@getEndOfDay", DateTime.Today.AddDays(1));
    

    【讨论】:

    • 我读了代码.. 会是一样的,你的实际上更倾向于编码方面,比如指定 >= /
    【解决方案3】:

    日期格式似乎不正确。您只需要 DateTime 中的日期部分,因为您自己附加时间部分。

    String todayDate = DateTime.Now.Date.ToString();

    将上面的行改为:

    String todayDate = DateTime.Now.ToString("yyyy-MM-dd");

    【讨论】:

      【解决方案4】:

      更好的方法是为今天创建一个日期时间对象,开始时间为 0 小时和秒,然后在结束日期之后添加小时和分钟

                  cmd.Parameters.AddWithValue("@getStartOfDay", DateTime.Today);
                  cmd.Parameters.AddWithValue("@getEndOfDay", DateTime.Today.AddHours(23).AddMinutes(59).AddSeconds(59));
                  cmd.Parameters.AddWithValue("@getType", "Login");
      

      【讨论】:

        猜你喜欢
        • 2015-12-03
        • 2013-08-29
        • 1970-01-01
        • 2014-10-13
        • 2014-06-18
        • 1970-01-01
        • 2019-08-03
        • 2011-03-04
        • 2018-02-05
        相关资源
        最近更新 更多