Запрос SQL для вставки даты и времени в SQL Server


133

Я хочу вставить 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

Пожалуйста, помогите! Спасибо.

Ответы:


229

Вы захотите использовать ГГГГММДД для однозначного определения даты в 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вот стиль итальянских фиников. Ну, не только итальянцы, но и это культура, которую приписывают в Интернет-книгах .


1
Спасибо, это работает. Кстати, нельзя ли вводить в формате ДД-ММ-ГГ?
Shee

@RichardTheKiwi, что 5означает?
Shee

@Shee see добавил нижний колонтитул для ответа
RichardTheKiwi

4
Я исправлюсь - если вы используете YYYYMMDD HH:MM:SS(в 24-часовом формате - мировой формат, кто угодно, кроме США, не только военный ...) без тире - это работает, даже для Britishязыка. Однако, если вы используете YYYY-MM-DD HH:MM:SS, он не работает - в этом случае (с тире) вам нужно разделить дату и время Tлитералом.
marc_s

1
@Shee Взгляни на SET DATEFORMATзаявление . Это настройка для отдельного подключения, но ее можно указать для всего сервера. Вы также можете указать, SET LANGUAGEчтобы контролировать такие вещи, как какой символ используется для системы счисления и т. Д., И формат даты будет унаследован от этого (опять же, на уровне сервера или соединения). Просто по умолчанию используется американский английский, а mdy - американский формат. Однако ymd с датами 4 года всегда работает.
Bacon Bits

29

Более независимым от языка выбором для строковых литералов является международный стандарт ISO 8601 в формате «ГГГГ-ММ-ДДTчч: мм: сс». Я использовал приведенный ниже запрос 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 «ГГГГ-ММ-ДД чч: мм: сс» должен быть «многоязычным». Однако при использовании того же запроса формат ANSI работает не на всех языках SQL.

Например, на датском языке будет много ошибок, например следующих:

Ошибка на датском языке. Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.

Если вы хотите создать запрос на C # для запуска на SQL Server и вам нужно передать дату в формате ISO 8601, используйте описатель формата Sortable «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


8

вам нужно добавить это как

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

2

Нет необходимости использовать convert. Просто укажите дату в формате 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 - это переменная datetime, которая содержит вашу дату в вашем формате.


1

Я сталкиваюсь с более общей проблемой: получение разных (и не обязательно известных) форматов datetime и вставка их в столбец datetime. Я решил это с помощью этого оператора, который, наконец, стал скалярной функцией (актуален для канонического, американского, ANSI и британского \ franch стиля даты - 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.