Truy vấn Sql để chèn datetime trong SQL Server


133

Tôi muốn chèn một datetimegiá trị vào một bảng (SQL Server) bằng cách sử dụng truy vấn sql bên dưới

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

Nhưng tôi nhận được thông báo lỗi này. Incorrect syntax near '10'.

Tôi đã thử nó với dấu ngoặc kép

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

Tôi nhận được thông báo lỗi này Cannot convert varchar to datetime

Giúp đỡ một cách tử tế! Cảm ơn.

Câu trả lời:


229

Bạn sẽ muốn sử dụng YYYYMMDD để xác định ngày rõ ràng trong SQL Server.

insert into table1(approvaldate)values('20120618 10:34:09 AM');

Nếu bạn kết hôn với dd-mm-yy hh:mm:ss xmđịnh dạng, bạn sẽ cần sử dụng CHUYỂN ĐỔI với kiểu dáng cụ thể.

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5đây là phong cách cho ngày tháng Ý. Chà, không chỉ người Ý, mà đó là văn hóa mà nó được gán cho trong Sách trực tuyến .


1
Cảm ơn bạn .. Nó hoạt động. Btw là không thể nhập ở định dạng DD-MM-YY?
Shee

@RichardTheKiwi có 5nghĩa là gì?
Shee

@Shee xem thêm chân trang để trả lời
RichardTheKiwi

4
Tôi đã sửa chữa - nếu bạn đang sử dụng YYYYMMDD HH:MM:SS(ở định dạng 24 giờ - định dạng thế giới, bất kỳ ai trừ Hoa Kỳ sử dụng điều này, không chỉ quân đội ....) mà không có dấu gạch ngang - nó hoạt động, ngay cả đối với Britishngôn ngữ. YYYY-MM-DD HH:MM:SSTuy nhiên, nếu bạn sử dụng , nó không thành công - trong trường hợp đó (với dấu gạch ngang), bạn cần phải phân tách ngày và giờ bằng một Tnghĩa đen.
marc_s

1
@Shee Hãy xem SET DATEFORMATtuyên bố . Đây là cài đặt cho một kết nối riêng lẻ, nhưng cài đặt có thể được chỉ định trên toàn máy chủ. Bạn cũng có thể chỉ định SET LANGUAGEđể kiểm soát những thứ như ký tự nào được sử dụng cho cơ số và như vậy, và định dạng ngày sẽ kế thừa từ đó (một lần nữa, ở cấp độ máy chủ hoặc kết nối). Chỉ có mặc định là tiếng Anh Mỹ và mdy là định dạng của Hoa Kỳ. Tuy nhiên, ymd với 4 năm không phải lúc nào cũng hoạt động.
Bacon Bits

29

Một lựa chọn độc lập với ngôn ngữ hơn cho chuỗi ký tự chuỗi là định dạng ISO 8601 tiêu chuẩn quốc tế "YYYY-MM-DDThh: mm: ss". Tôi đã sử dụng truy vấn SQL bên dưới để kiểm tra định dạng và nó thực sự hoạt động trong tất cả các ngôn ngữ SQL trong sys.syslacular :

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

Theo phần Định dạng chuỗi ngày và định dạng chuỗi trong Microsoft TechNet, định dạng ngày SQL tiêu chuẩn ANSI "YYYY-MM-DD hh: mm: ss" được coi là "đa ngôn ngữ". Tuy nhiên, sử dụng cùng một truy vấn, định dạng ANSI không hoạt động trong tất cả các ngôn ngữ SQL.

Ví dụ: trong tiếng Đan Mạch, bạn sẽ gặp nhiều lỗi như sau:

Lỗi trong ngôn ngữ Tiếng Đan Mạch Việc chuyển đổi một kiểu dữ liệu varchar thành kiểu dữ liệu datetime dẫn đến một giá trị ngoài phạm vi.

Nếu bạn muốn xây dựng một truy vấn trong C # để chạy trên SQL Server và bạn cần vượt qua một ngày ở định dạng ISO 8601, hãy sử dụng công cụ xác định định dạng "s" Sắp xếp :

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

Có vẻ như bạn chỉ có thể sử dụng YYYYMMDDcho ngày, và YYYY-MM-DDThh:mm:ss(với dấu gạch ngang, và vâng, Tgiữa phần ngày và giờ!) Hoặc YYYYMMDD HH:MM:SS(không dấu gạch ngang, không phân tách bằng chữ) để thực sự độc lập ngôn ngữ ...
marc_s

1
@marc_s: Cảm ơn bạn đã bình luận. Tôi đã chỉnh sửa câu trả lời của mình để đề cập đến định dạng ISO 8601 (bao gồm cả chữ T như bạn đã đề cập).
Paul Williams

chèn vào các giá trị @TestLang (langdate) ('2012-06-18T10: 34: 09') là câu trả lời tốt nhất.
Mert DOĞAN

20

Studio quản lý tạo các kịch bản như:

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))

8

bạn cần thêm nó vào

insert into table1(date1) values('12-mar-2013');

2

Không cần sử dụng convert. Chỉ cần liệt kê nó là một ngày được trích dẫn ở định dạng ISO 8601.
Thích như vậy:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

Dấu phân cách cần phải là một /và nó cần được bao quanh bởi các 'dấu ngoặc đơn .


1

Nếu bạn đang lưu trữ giá trị thông qua bất kỳ ngôn ngữ lập trình

Đây là một ví dụ trong C #

Để lưu trữ ngày, bạn phải chuyển đổi nó trước và sau đó lưu trữ

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDate là biến datetime chứa ngày của bạn ở định dạng của bạn.


1

Tôi gặp phải một vấn đề chung chung hơn: nhận các định dạng datetime khác nhau (và không nhất thiết phải biết) và chèn chúng vào cột datetime. Tôi đã giải quyết nó bằng cách sử dụng câu lệnh này, cuối cùng đã trở thành một hàm vô hướng (có liên quan đến phong cách ngày chính thức của ODBC, American, ANSI và british \ - có thể được mở rộng):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
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.