2011-07-04 26 views
22

Tôi có một bảng và ngày-thời gian trong đó là ở định dạng:Làm cách nào để chuyển datetime từ C# sang sql chính xác?

2011-07-01 15:17:33.357 

Tôi lấy aC# DateTime khi tôi làm một ToString() trên đối tượng Tôi nhận được một DateTime trong định dạng :

04/07/2011 06:06:17 

Tôi tự hỏi làm cách nào tôi chuyển đúng DateTime chính xác vì khi tôi chạy SQL trong mã của chúng tôi, nó không hoạt động (tức là chọn DateTime chính xác). Tôi không thể sử dụng SQL profiler.

Đây là mã:

//looks to if a user has had any activity in within the last time specified 
     public bool IsUserActivitySinceSuppliedTime(int userId, DateTime since) 
     { 
      //get everything since the datetime specified [usually 5 hours as this is 
      //how long the session lasts for 
      string sql = "SELECT * FROM tbl_webLogging WHERE userid = @userid AND DateAdded > @sinceDateTime"; 

      SqlParameter sinceDateTimeParam = new SqlParameter("@sinceDateTime", SqlDbType.DateTime); 
      sinceDateTimeParam.Value = since; 

      SqlCommand command = new SqlCommand(sql); 
      command.Parameters.AddWithValue("@userid", userId); 
      command.Parameters.Add(sinceDateTimeParam); 


      using (SqlDataReader DataReader = GetDataReader(command)) 
      { 
       if (DataReader.HasRows) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 


     } 

CẬP NHẬT *******************

tôi đã chạy lệnh sau đây trên dữ liệu:

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '2011-07-01 07:19:58.000' 

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '04/07/2011 07:19:58' 

Một trả 53 reco rds khác trả về 69 hồ sơ. Làm sao có thể? Và khi tôi vượt qua các DateTime (04/07/2011 07:19:58) từ C# đến SQL không có hồ sơ hiển thị ở tất cả!

+1

Loại cột 'DateAdded' trong bảng của bạn là gì? Có phải là DateTime không? Hoặc một số loại VARCHAR? –

+0

Bạn có thể xác nhận rằng 'DateAdded' có kiểu' datetime', không phải cái gì đó giống '[n] varchar (x)'? –

+0

Vậy tại sao C# datetime trở lại với 0 bản ghi? (trình gỡ lỗi nói rằng đó là '04/07/2011 07:19:58 ') @Maras kiểu dữ liệu là datetime .... – Exitos

Trả lời

19

Bạn đã thực hiện nó một cách chính xác bằng cách sử dụng một tham số DateTime với giá trị từ DateTime, vì vậy nó nên đã làm việc. Quên về ToString() - vì nó không được sử dụng ở đây.

Nếu có sự khác biệt, có nhiều khả năng là làm với độ chính xác khác nhau giữa hai môi trường; có thể chọn làm tròn (giây, có thể?) và sử dụng nó. Ngoài ra hãy ghi nhớ UTC/local/unknown (DB không có khái niệm về "loại" của ngày; .NET nào).

Tôi có một bảng và datetimes trong đó là ở định dạng: 2011-07-01 15:17:33.357

Lưu ý rằng datetimes trong cơ sở dữ liệu đang không ở trong bất kỳ định dạng đó; đó chỉ là truy vấn-khách hàng của bạn cho bạn thấy những lời nói dối màu trắng. Nó được lưu trữ như một số (và thậm chí đó là chi tiết triển khai), bởi vì con người có khuynh hướng kỳ lạ này không nhận ra rằng ngày bạn đã hiển thị giống như ngày 40723.6371916281. Con người ngu ngốc. Bằng cách xử lý nó đơn giản như một "datetime" trong suốt, bạn sẽ không gặp bất kỳ vấn đề gì.

+0

Chỉ cần không nhận được bất cứ điều gì trở lại. LƯU Ý: Tôi chỉ nói To.String là ... vì tôi đang tìm trong trình gỡ rối. Nhưng khi tôi chạy mã trên, nó sẽ không nhận được bất kỳ hàng nào. Làm thế nào tôi có thể gỡ lỗi này? – Exitos

+0

@ Pete2k, có dữ liệu phù hợp nào không? và nó là một vấn đề '>' vs '> ='? –

+0

Tôi đã thêm bản cập nhật – Exitos

6

Tôi có nhiều vấn đề liên quan đến C# và SqlServer. Tôi đã kết thúc cách làm như sau:

  1. Mở SQL Server tôi sử dụng cột kiểu DateTime
  2. On C# tôi sử dụng ToString ("hh yyyy-MM-dd: mm: ss") phương pháp

Cũng đảm bảo rằng tất cả các máy của bạn chạy trên cùng một múi giờ.

Về kết quả khác nhau tập hợp bạn nhận được, ví dụ đầu tiên của bạn là "Tháng Bảy đầu tiên" trong khi thứ hai là "04 Tháng Bảy" ...

Ngoài ra, ví dụ thứ hai có thể được cũng hiểu là "Ngày 7 tháng 4", nó phụ thuộc vào cấu hình địa phương hóa máy chủ của bạn (giải pháp của tôi không bị vấn đề này).

+1

'.String (" yyyy-MM-dd hh: mm: ss ")' không phải là cách tốt nhất để loại bỏ sự mơ hồ; cách tốt hơn là truyền dữ liệu đã nhập, do đó không được mơ hồ. Mã trong câu hỏi là * tốt hơn * so với sử dụng 'ToString (...)' với bất kỳ định dạng cụ thể nào. –

+2

Mã được đề cập không hoạt động vì một lý do nào đó, vì vậy giải pháp tốt hơn sẽ làm cho mã hoạt động và cung cấp kết quả mong đợi. Sau đó có rất nhiều điều để xem xét những gì sẽ số tiền thậm chí là một giải pháp "tốt hơn". – Eden

+0

Tôi sử dụng '.ToString (yyyy-MM-ddThh: mm: ss)'. Bằng cách nào đó theo cách này tôi luôn biết những gì mong đợi. Chỉ định loại SqlDateTime không hoạt động cho tôi một lần, tôi đã kết thúc có '2012-01-30 AM 10: 15: 30', trong khi trong SQL nó là' 2012-01-30 10: 15: 30'. Không thực sự chắc chắn tại sao ... chỉ 2 xu của tôi – nomail

Các vấn đề liên quan