Sql-запит для вставки дати в SQL Server


133

Я хочу вставити datetimeзначення в таблицю (SQL Server) за допомогою запиту sql нижче

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

Але я отримую цю помилку msg. Incorrect syntax near '10'.

Я спробував це з цитатами

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

Я отримую це повідомлення про помилку Cannot convert varchar to datetime

Ласкаво допоможіть! Дякую.

Відповіді:


229

Ви хочете використовувати YYYYMMDD для однозначного визначення дати в SQL Server.

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

Якщо ви одружені з dd-mm-yy hh:mm:ss xmформатом, вам потрібно буде використовувати CONVERT з певним стилем.

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

5ось стиль італійських побачень. Ну, не лише італійці, але це культура, яку їй приписують у Books Online .


1
Дякую .. Це працює. До речі, не можна вводити формат DD-MM-YY?
Ши

@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-річними датами, однак, працює завжди.
Бакони з беконом

29

Більш незалежним від мови варіантом рядкових літералів є міжнародний стандарт ISO 8601 формату "РРРР-ММ-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 "РРРР-MM-DD год. Год .: мм: сс" повинен бути "багатомовним". Однак, використовуючи той самий запит, формат 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, як ви згадували).
Пол Вільямс

вставити в значення @TestLang (langdate) ("2012-06-18T10: 34: 09") - найкраща відповідь.
MERT DOĞAN

20

Студія управління створює такі сценарії, як:

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

8

вам потрібно додати його як

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

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

У мене виникає більш загальна проблема: отримання різних (і не обов’язково відомих) форматів дати та вставлення їх у стовпчик дати. Я вирішив це за допомогою цього твердження, яке, нарешті, стало скалярною функцією (актуально для канонічного, американського, американського, ANSI та стилю дати британського \ франш ODBC - можна розширити):

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))) 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.