Định dạng DateTime sang định dạng SQL bằng C #


111

Tôi đang cố gắng lưu định dạng ngày tháng hiện tại từ C # và chuyển đổi nó sang định dạng ngày tháng của SQL Server như vậy yyyy-MM-dd HH:mm:ssđể tôi có thể sử dụng nó cho UPDATEtruy vấn của mình .

Đây là mã đầu tiên của tôi:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

Kết quả đúng ngày thì không sao, nhưng thời gian luôn là "12:00:00" nên tôi đã thay đổi mã của mình thành như sau:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.TimeOfDay.ToString("HH:mm:ss");

Nó đã cho tôi lỗi biên dịch này:

FormatException không được xử lý

Và đề nghị tôi cần phải phân tích cú pháp. Vì vậy, tôi đã thử làm điều này với mã của mình theo nghiên cứu của tôi ở đây trong StackOverflow:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

hoặc là

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

Nhưng nó nói với tôi rằng đó là một phương thức không hợp lệ cho ngữ cảnh nhất định. Tôi đã thử tìm kiếm giải pháp cho vấn đề của mình và tôi đã bị mắc kẹt trong hai giờ. Tôi vẫn còn một chút mới trong C #, bạn có thể giúp tôi không?


Bạn đã xem DateTime.TryParseExact chưa?
Tim


3
Tại sao không sử dụng một tham số để cập nhật DateTimehoặc bạn đang lưu trữ nó dưới dạng một chuỗi? Cũng ToStringtrên Datecó ngụ ý rằng thời gian luôn là12:00:00
V4Vendetta

3
Bạn nên sử dụng truy vấn được tham số hóa với tham số kiểu DATETIMEvà sau đó bạn có thể tránh thực hiện tất cả việc chuyển đổi qua lại tới và đi từ một biểu diễn chuỗi!
marc_s

5
Như những người khác đã nói, sử dụng các tham số và chỉ giữ mọi thứ như bình datetimethường sẽ là một khởi đầu tốt. Thậm chí tốt hơn, tại sao bạn đang chuyển máy chủ vào thời điểm hiện tại - nó có một GETDATE()chức năng có thể được gọi hoàn toàn ở phía máy chủ.
Damien_The_Un Believer

Câu trả lời:


219

thử cái này bên dưới

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

cảm ơn bạn rất nhiều, tôi đã thử string sqlFormattedDate = myDateTime.DateTime ... vì một số lý do đây là những gì tôi muốn đạt được.
Ace Caserya

Tìm kiếm của tôi trong stackoverflow liên tục giới thiệu tôi đến một tham chiếu sai mặc dù câu hỏi đã được trả lời nhiều lần, những người mới như tôi không thể liên quan vì điều này. Xin lỗi tất cả, tôi sẽ đóng câu hỏi ngay khi có thể.
Ace Caserya

1
Tôi nghĩ rằng định dạng "Sortable" trong C # cũng làm được điều tương tự. Vì vậy, bạn chỉ có thể thực hiện myDateTime.ToString ("s");
ProVega

@ProVega nó trông không giống nhau (.ToString ('s') có chữ T thay vì khoảng cách giữa ngày và giờ) - nhưng tôi có thể xác nhận rằng chúng được phân tích cú pháp giống nhau bởi máy chủ SQL có hoặc không có chữ T ( Tôi vào năm 2012). Tôi đã bắt đầu sử dụng 's' làm định dạng ngày giờ ghi nhật ký của mình, vì vậy tôi nghĩ rằng tôi sẽ sử dụng 's', cảm ơn!
Ian Grainger

Vâng, trên trang chính thức CAST và CONVERT (Transact-SQL) , họ sử dụng tên "ODBC canonical" cho biểu mẫu có dấu cách tách biệt yyyy-MM-ddvới thời gian trong ngày và tên "ISO8601" cho biểu mẫu có ký tự phân tách. a T. Nhưng có, cả hai dạng đều chuyển đổi hoàn toàn (và chính xác) thành a datetime.
Jeppe Stig Nielsen

44

Việc sử dụng định dạng ngày giờ chuẩn "s" cũng sẽ đảm bảo khả năng tương thích quốc tế hóa (MM / dd so với dd / MM):

myDateTime.ToString("s");

=> 2013-12-31T00:00:00

Hoàn thành Tùy chọn: (mã: kết quả mẫu)

d: 6/15/2008 
D: Sunday, June 15, 2008 
f: Sunday, June 15, 2008 9:15 PM 
F: Sunday, June 15, 2008 9:15:07 PM 
g: 6/15/2008 9:15 PM 
G: 6/15/2008 9:15:07 PM 
m: June 15 
o: 2008-06-15T21:15:07.0000000 
R: Sun, 15 Jun 2008 21:15:07 GMT 
s: 2008-06-15T21:15:07 
t: 9:15 PM 
T: 9:15:07 PM 
u: 2008-06-15 21:15:07Z 
U: Monday, June 16, 2008 4:15:07 AM 
y: June, 2008 

'h:mm:ss.ff t': 9:15:07.00 P 
'd MMM yyyy': 15 Jun 2008 
'HH:mm:ss.f': 21:15:07.0 
'dd MMM HH:mm:ss': 15 Jun 21:15:07 
'\Mon\t\h\: M': Month: 6 
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

Được hỗ trợ trong .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Tham khảo: DateTime.ToStringPhương pháp


1
Điều này không đủ chi tiết (bỏ lỡ mili giây) và sẽ khiến bạn gặp rắc rối trong các truy vấn dựa vào việc sắp xếp theo ngày.
reijerh

Để lấy giờ và phút, bạn cũng có thể sử dụng chuyển đổi này: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed

9

Câu trả lời đúng đã được đưa ra "sử dụng tham số". Việc định dạng ngày và chuyển nó dưới dạng một chuỗi tới SQL-Server có thể dẫn đến lỗi vì nó phụ thuộc vào cài đặt cách diễn giải ngày ở phía máy chủ. Ở châu Âu, chúng tôi viết '1.12.2012' để chỉ ngày 1 tháng 12 năm 2012, trong khi ở các quốc gia khác, điều này có thể được coi là ngày 12 tháng 1.

Khi phát hành các câu lệnh trực tiếp trong SSMS, tôi sử dụng định dạng yyyymmddcó vẻ khá chung chung. Tôi không gặp bất kỳ sự cố nào trên các cài đặt khác nhau mà tôi đã làm việc cho đến nay.

Có một định dạng khác hiếm khi được sử dụng, hơi kỳ lạ nhưng phù hợp với tất cả các phiên bản:

select { d '2013-10-01' }

sẽ trở lại vào đầu tháng 10 năm 2013.

select { ts '2013-10-01 13:45:01' }

sẽ trở lại ngày 1 tháng 10, 1:45:01 chiều

Tôi thực sự khuyên bạn nên sử dụng các tham số và không bao giờ định dạng mã SQL của riêng bạn bằng cách dán các đoạn câu lệnh được định dạng cây nhà lá vườn với nhau. Đây là một mục nhập cho SQL injection và các lỗi lạ (định dạng giá trị float là một vấn đề tiềm ẩn khác)


3

Mã đầu tiên của bạn sẽ hoạt động bằng cách thực hiện điều này

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part 

3

Vấn đề của bạn là ở thuộc tính "Ngày tháng" chỉ cắt ngắn DateTimeđến ngày. Bạn có thể đặt chuyển đổi như thế này:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

2

Câu trả lời tôi đang tìm kiếm là:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

Tôi cũng đã học được rằng bạn có thể làm theo cách này:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

trong đó myCountryDateFormat có thể được thay đổi để đáp ứng sự thay đổi tùy theo yêu cầu.

Xin lưu ý rằng thẻ được gắn thẻ "Câu hỏi này có thể đã có câu trả lời ở đây:" chưa thực sự trả lời câu hỏi vì bạn có thể thấy nó đã sử dụng ".Date" thay vì bỏ qua nó. Nó khá khó hiểu đối với các lập trình viên mới của .NET


2

nếu bạn muốn lưu trữ ngày hiện tại trong bảng để bạn có thể sử dụng

HẸN GẶP();

hoặc chuyển hàm này dưới dạng tham số

ví dụ. 'update tblname set curdate = GETDATE () where colname = 123'


1

Tại sao không bỏ qua chuỗi hoàn toàn:

SqlDateTime myDateTime = DateTime.Now;

1

Vấn đề của bạn là ở Datetài sản mà chỉ cắt ngắn DateTimecho đến nay. Bạn có thể đặt chuyển đổi như thế này:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

Cảm ơn. Đúng như những gì tôi đang tìm kiếm;) Microsoft ngạc nhiên đã không thêm cờ hoặc lệnh để thực hiện việc này ngắn gọn hơn.
Zeek2

0

Một giải pháp khác để chuyển DateTime từ C # sang SQL Server, bất kể cài đặt ngôn ngữ SQL Server

được cho là Cài đặt khu vực của bạn hiển thị ngày dưới dạng dd.MM.yyyy (tiêu chuẩn Đức '104') thì

DateTime myDateTime = DateTime.Now;
string sqlServerDate ="CONVERT("date,'"+myDateTime+"',104)"; 

chuyển biến datetime của C # sang biến kiểu Ngày của SQL Server, xem xét ánh xạ theo quy tắc "104". Sql Server date là yyyy-MM-dd

Nếu Cài đặt Khu vực của bạn hiển thị DateTime khác, thì hãy sử dụng đối sánh thích hợp từ Bảng CHUYỂN ĐỔI Máy chủ SQL

xem thêm về Quy tắc: https://www.techonthenet.com/sql_server/functions/convert.php


0

Tôi nghĩ vấn đề là thiếu hai dấu ngoặc kép.

Đây là sql tôi chạy tới MSSMS:

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

Như bạn có thể thấy, có hai dấu ngoặc kép, vì vậy mã của bạn phải là:

string sqlFormattedDate = "'" + myDateTime.Date.ToString("yyyy-MM-dd") + " " + myDateTime.TimeOfDay.ToString("HH:mm:ss") + "'";

Sử dụng dấu ngoặc kép cho mọi chuỗi trong MSSQL hoặc thậm chí trong MySQL. Tôi hi vọng cái này giúp được.


0

Hãy sử dụng lớp SqlDateTime được tích hợp sẵn

new SqlDateTime(DateTime.Now).ToSqlString()

Nhưng vẫn cần kiểm tra các giá trị null. Điều này sẽ ném ngoại lệ tràn

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.



-1

Nếu bạn muốn cập nhật bảng với dateTime đó, bạn có thể sử dụng chuỗi sql của mình như ví dụ sau:

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}, myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

2
Câu hỏi này đã được trả lời và chấp nhận với một giải pháp thanh lịch hơn. Và bạn đang bỏ lỡ một kết thúc ".
Ngày

-1
   DateTime date1 = new DateTime();

    date1 = Convert.ToDateTime(TextBox1.Text);
    Label1.Text = (date1.ToLongTimeString()); //11:00 AM
    Label2.Text = date1.ToLongDateString(); //Friday, November 1, 2019;
    Label3.Text = date1.ToString();
    Label4.Text = date1.ToShortDateString();
    Label5.Text = date1.ToShortTimeString();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.