แบบสอบถาม Sql เพื่อแทรกวันที่และเวลาใน SQL Server


137

ฉันต้องการแทรกdatetimeค่าลงในตาราง (SQL Server) โดยใช้แบบสอบถาม sql ด้านล่าง

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

แต่ฉันได้รับข้อความแสดงข้อผิดพลาดนี้ Incorrect syntax near '10'.

ฉันลองใช้กับคำพูด

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

ฉันได้รับข้อความแสดงข้อผิดพลาดนี้ Cannot convert varchar to datetime

กรุณาช่วย! ขอบคุณ.

คำตอบ:


238

คุณจะต้องใช้ YYYYMMDD สำหรับการกำหนดวันที่ไม่ชัดเจนใน SQL Server

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

หากคุณแต่งงานกับdd-mm-yy hh:mm:ss xmรูปแบบคุณจะต้องใช้ CONVERT กับรูปแบบเฉพาะ

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

5นี่คือสไตล์สำหรับวันที่อิตาลี ดีไม่เพียง แต่ชาวอิตาเลียน แต่นั่นคือวัฒนธรรมที่มันมาประกอบกับในหนังสือออนไลน์


1
ขอบคุณครับ.. ได้ผล Btw เป็นไปไม่ได้ที่จะป้อนในรูปแบบ DD-MM-YY?
Shee

@RichardTheKiwi 5หมายถึงอะไร?
ชี

@Shee ดูเพิ่มส่วนท้ายเพื่อตอบ
RichardTheKiwi

4
ฉันยืนหยัดแก้ไข - ถ้าคุณใช้YYYYMMDD HH:MM:SS(ในรูปแบบ 24 ชั่วโมง - รูปแบบโลกใครก็ได้ยกเว้นสหรัฐฯใช้สิ่งนี้ไม่ใช่แค่การทหาร .... ) โดยไม่มีขีดกลาง - ใช้งานได้แม้ในBritishภาษา YYYY-MM-DD HH:MM:SSอย่างไรก็ตามหากคุณใช้งานจะล้มเหลว - ในกรณีนั้น (มีขีดกลาง) คุณจำเป็นต้องแยกวันที่และเวลาด้วยTตัวอักษร
marc_s

1
@Shee ลองดูที่เป็นคำสั่งSET DATEFORMAT นี่คือการตั้งค่าสำหรับการเชื่อมต่อแต่ละรายการ แต่สามารถระบุการตั้งค่าได้ทั้งเซิร์ฟเวอร์ นอกจากนี้คุณยังสามารถระบุSET LANGUAGEเพื่อควบคุมสิ่งต่างๆเช่นอักขระที่ใช้สำหรับ radix และรูปแบบวันที่จะสืบทอดมาจากนั้น (อีกครั้งที่เซิร์ฟเวอร์หรือระดับการเชื่อมต่อ) เพียงแค่ว่าค่าเริ่มต้นคือภาษาอังกฤษแบบสหรัฐอเมริกาและ mdy คือรูปแบบสหรัฐอเมริกา อย่างไรก็ตาม ymd ที่มีวันที่ 4 ปีจะได้ผลเสมอ
Bacon Bits

29

ตัวเลือกที่ไม่ขึ้นกับภาษาสำหรับตัวอักษรสตริงคือรูปแบบISO 8601มาตรฐานสากล "YYYY-MM-DDThh: mm: ss" ฉันใช้แบบสอบถาม SQL ด้านล่างเพื่อทดสอบรูปแบบและมันใช้งานได้จริงในภาษา SQL ทั้งหมดในsys.syslanguages :

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

ตามส่วนรูปแบบวันที่และเวลาตามตัวอักษรใน Microsoft TechNet รูปแบบวันที่มาตรฐาน ANSI Standard SQL "YYYY-MM-DD hh: mm: ss" ควรเป็น "หลายภาษา" อย่างไรก็ตามการใช้แบบสอบถามเดียวกันรูปแบบ ANSI ไม่สามารถใช้ได้กับภาษา SQL ทั้งหมด

ตัวอย่างเช่นในภาษาเดนมาร์กคุณจะพบข้อผิดพลาดหลายประการดังต่อไปนี้:

ข้อผิดพลาดในภาษาเดนมาร์กการแปลงประเภทข้อมูล varchar เป็นประเภทข้อมูลวันที่และเวลาส่งผลให้ค่าอยู่นอกช่วง

ถ้าคุณต้องการสร้างแบบสอบถามใน C # เพื่อให้ทำงานบน SQL Server และคุณต้องส่งวันที่ในรูปแบบ ISO 8601 ให้ใช้ตัวระบุรูปแบบ "s" ที่เรียงได้ :

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

ดูเหมือนว่าคุณสามารถใช้YYYYMMDDสำหรับวันที่เท่านั้นและอย่างใดอย่างหนึ่งYYYY-MM-DDThh:mm:ss(มีขีดกลางและใช่Tระหว่างส่วนวันที่และเวลา!) หรือYYYYMMDD HH:MM:SS(ไม่มีขีดกลางไม่มีการคั่นตามตัวอักษร) เพื่อให้เป็นภาษาที่เป็นอิสระอย่างแท้จริง ...
marc_s

1
@marc_s: ขอบคุณสำหรับความคิดเห็น ฉันแก้ไขคำตอบของฉันเพื่อพูดถึงรูปแบบ ISO 8601 (ซึ่งรวมถึงตัวอักษร T ตามที่คุณกล่าวถึง)
Paul Williams

ใส่ในค่า @TestLang (langdate) ('2012-06-18T10: 34: 09') เป็นคำตอบที่ดีที่สุด
MERT DOĞAN



2

ไม่ต้องใช้แปลง เพียงระบุเป็นวันที่ที่ยกมาในรูปแบบ ISO 8601
ชอบมาก:

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

ตัวคั่นต้องเป็น a /และต้องล้อมรอบด้วย'เครื่องหมายคำพูดเดี่ยว


1

หากคุณจัดเก็บค่าผ่านภาษาโปรแกรมใด ๆ

นี่คือตัวอย่างใน C #

ในการจัดเก็บวันที่คุณต้องแปลงก่อนแล้วจึงจัดเก็บ

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

FooDate เป็นตัวแปรวันที่และเวลาซึ่งมีวันที่ของคุณในรูปแบบของคุณ


1

ฉันพบปัญหาทั่วไปมากขึ้น: การรับรูปแบบวันที่และเวลาที่แตกต่างกัน (และไม่จำเป็นต้องทราบ) และแทรกลงในคอลัมน์วันที่และเวลา ฉันได้แก้ไขโดยใช้คำสั่งนี้ซึ่งในที่สุดก็กลายเป็นฟังก์ชันสเกลาร์ (เกี่ยวข้องกับ ODBC canonical, american, ANSI และ british \ franch date style - สามารถขยายได้):

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))) 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.