2017-07-26 87 views
1

我有一個方法實際上從名爲AuditActivity的表中獲得count,從而它分別需要今天的開始時間和今天的結束時間00:00:00和23:59:59以及另一個條件。 A datetime範圍。錯誤以編程方式轉換設置日期時間

例如,今天的日期26/07/17,我想指定的where條件爲DateTimeActivity採取count只有當它是between 26/07/17 00:00:00 26/07/17 23:59:59。

我知道我在編碼實際上是錯誤的,但我似乎無法做到正確。

我目前正在轉換nvarchardatetime這是不對的..

額外信息:datatype爲DateTimeActivity是datetimedatabase

而作爲右上面提到的字段的值的例子: '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; 
    } 
} 

錯誤我越來越:

enter image description here

任何幫助非常感謝!謝謝!

+2

我想問題是'todayDate'的值是''07/26/2017 00:00:00'',然後你傳遞給'Convert.ToDateTime()'最終會變成'' 07/26/2017 00:00:00 00:00:00「'。正如其他人所指出的,一直使用'DateTime'不要使用字符串。 –

+1

同意。使用建議的答案之一將爲您解決這個問題。 – Cory

回答

3

你得到的錯誤,因爲

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); 
1

這是一個配方,你可以使用

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)); 
+0

我讀的代碼..將是相同的,你實際上是更多的編碼方面,如指定> =/<更多或等於/小於。欣賞它! – domster

-2

一個更好的辦法是創建今日DateTime對象爲0小時,秒的啓動時間,然後添加小時和分鐘後爲結束日期

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

它看起來像日期格式是不正確的。由於您自己附加時間部分,因此您只需要DateTime中的日期部分。

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

更改上面的行到:

字符串todayDate = DateTime.Now.ToString( 「YYYY-MM-DD」);