2014-01-14 110 views
2

我在SQL Server存儲過程中使用GETDATE()將日期插入到SQL Server數據庫表中。datetime in C#vs,SQL和GETDATE()from SQL Server

之後,我需要實現一個基於datetime輸入參數的C#函數查找日期是否保存在表中。

C#和SQL中的日期時間是不同的。如何從C#datetime轉換爲SQL日期時間格式爲yyyy-mm-ddT:yy:mm:ss.mmm?我需要明確指定yyyy-mm-ddT:yy:mm:ss.mmm

對所有命題/可能的方式都會很高興。

+1

我不確定格式與比較有什麼關係? –

+1

不,T-SQL中的'DATETIME'和.NET中的'DateTime' **不是**不同的 - 您可以在SQL Server中將**任何**'DATETIME'表示爲.NET'DateTime'。 SQL Server中的「DATETIME」在範圍(1753年1月1日至9999年12月31日)和準確性(3.33ms)方面有限制,但在SQL Server ** 2008中不推薦使用,不應再使用;使用'DATE'(如果你只需要日期 - 沒有時間)或'DATETIME2(n)'而不是 –

回答

4

DateTime in .Net框架和SQL Server (如果它是DateTime類型字段)不考慮格式。格式僅用於顯示輸出。

如果您在SQL Server場DateTime型的,那麼你可以從C#代碼中使用參數化查詢類似查詢它:

public DataTable GetRecords(DateTime dtParameter) 
{ 
    DataTable dt = null; 
    using (SqlConnection conn = new SqlConnection("connection string")) 
    { 
     using (SqlCommand cmd = new SqlCommand("SELECT * from yourTable where DateField = @dateparameter")) 
     { 
      conn.Open(); 
      cmd.Parameters.AddWithValue("@dateparameter",dtParameter); 
      SqlDataReader dr = cmd.ExecuteReader(); 
      //...rest of the code 
      dt.Load(dr); 
     } 
    } 
    return dt; 
} 
+0

datetime應該是用戶提供的參數 – Yakov

+0

@Yakov,那很好,你可以用參數替換'DateTime.Now'由用戶傳遞。它應該是.Net框架中的'DateTime'類型。 – Habib

+0

格式是2014年1月14日下午4:44。ss.mmm部分在哪裏? – Yakov

4

C#和SQL之間的日期時間是100%兼容的。如果您通過DateTime s,格式不應該有任何區別。如果你正在生成一個SQL字符串,那麼我強烈建議更改爲SQL參數,這樣你就不必擔心任何格式問題。

2

一個datetime沒有格式可言,它有一個值。 SQL-DateTimes和C#DateTimes是兼容的。所以不要將其轉換(至string),而是將其作爲日期時間參數傳遞給數據庫。

然後,如果DateTime的值在SqlDateTime.MinValue(1753年1月1日)和SqlDateTime.MaxValue(9999年12月31日)以內,那麼您很安全。

+0

我已經傳遞了值。但是sql存儲過程沒有找到值在表中。除此之外,它可能是秒數部分丟失 – Yakov

2

您不應該從客戶端代碼編寫DateTime.Now插入數據庫,因爲這將基於客戶端本地時間;執行此

public DateTime GetDatabaseTime() 
{ 
    var parameter = new SqlParameter("time", SqlDbType.DateTime2) 
    { 
     Direction = ParameterDirection.Output 
    }; 

    using (var connection = new SqlConnection(ConnectionString)) 
    { 
     connection.Open(); 

     using (var command = new SqlConnection("SELECT @time = SYSDATETIME()", connection)) 
     { 
      command.ExecuteNonQuery(); 
     } 
    } 

    return (DateTime)parameter.Value; 
} 

而且你永遠不應該在SQL Server中使用DATETIME你應該總是使用DATETIME2DATETIMEC#::DateTime不太準確,它會導致舍入誤差。我從痛苦的經歷中瞭解到這一點。

2

如果您使用的是實體框架,並且您的數據庫使用的是datetime而不是datetime2,則技巧是使用SqlDateTime來匹配.net轉換爲納秒的事實,而不是sql的毫秒精度。你可以在.NET中使用你的DateTime變量作爲SqlDateTime實例,然後你可以唯一地標識一條記錄到毫秒。

System.Data.SqlTypes.SqlDateTime entry2 = new System.Data.SqlTypes.SqlDateTime(new DateTime(dto.LookUpDateTime)); 
DateTime entry = entry2.Value; 

var existticket = from db in context.Tickets 
           where db.LookupDateTime == entry && db.UserId == UserId 
           select db;