Bạn đang thiết lập SqlParameter
như thế nào ? Bạn nên đặt SqlDbType
thuộc tính SqlDbType.DateTime
và sau đó chuyển DateTime
trực tiếp đến tham số (KHÔNG chuyển đổi thành chuỗi, khi đó bạn đang yêu cầu một loạt vấn đề).
Bạn sẽ có thể nhận giá trị vào DB. Nếu không, đây là một ví dụ rất đơn giản về cách thực hiện:
static void Main(string[] args)
{
// Create the connection.
using (SqlConnection connection = new SqlConnection(@"Data Source=..."))
{
// Open the connection.
connection.Open();
// Create the command.
using (SqlCommand command = new SqlCommand("xsp_Test", connection))
{
// Set the command type.
command.CommandType = System.Data.CommandType.StoredProcedure;
// Add the parameter.
SqlParameter parameter = command.Parameters.Add("@dt",
System.Data.SqlDbType.DateTime);
// Set the value.
parameter.Value = DateTime.Now;
// Make the call.
command.ExecuteNonQuery();
}
}
}
Tôi nghĩ một phần của vấn đề ở đây là bạn lo lắng rằng thực tế là thời gian ở UTC không được truyền tải đến SQL Server. Vì vậy, bạn không nên làm như vậy, bởi vì SQL Server không biết rằng một thời gian cụ thể nằm trong một khu vực / múi giờ cụ thể.
Nếu bạn muốn lưu trữ giá trị UTC, thì hãy chuyển đổi nó thành UTC trước khi chuyển nó đến SQL Server (trừ khi máy chủ của bạn có cùng múi giờ với mã máy khách tạo ra DateTime
và thậm chí sau đó, đó là một rủi ro, IMO). SQL Server sẽ lưu trữ giá trị này và khi bạn lấy lại, nếu bạn muốn hiển thị nó theo giờ cục bộ, bạn phải tự thực hiện việc đó (DateTime
struct sẽ dễ dàng thực hiện).
Tất cả những gì đang nói, nếu bạn thực hiện chuyển đổi và sau đó vượt qua ngày UTC được chuyển đổi (ngày có được bằng cách gọi ToUniversalTime
, không phải bằng cách chuyển đổi thành một chuỗi) sang thủ tục được lưu trữ.
Và khi bạn lấy lại giá trị, hãy gọi ToLocalTime
phương pháp để nhận thời gian theo múi giờ địa phương.