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


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

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

7 89

7 ответов:

вы хотите использовать YYYYMMDD для однозначного определения даты в SQL Server.

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

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

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

5 вот стиль для итальянских дат. Ну, не только итальянцы, но это культура, которую он приписывает в Книги Онлайн.

посмотреть строковый литерал формат даты и времени раздел в Microsoft TechNet.

вы можете использовать стандартный формат даты ANSI Standard SQL. Согласно ссылке выше, он помечен как "многоязычный":

insert into table1(approvaldate) values ('2012-06-18 10:34:09')
, это не будет работать на всех языках. Например, вот быстрый скрипт, который использует динамический 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-18 10: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

Если вы запускаете этот скрипт, у вас будет много ошибок, таких как:

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

более независимым от языка выбором для строковых литералов является международный стандарт ISO 8601. Этот формат очень похож на стандарт ANSI, за исключением литерала " T " между датой и временем:

insert into @TestLang (langdate) values ('2012-06-18T10:34:09')

Я проверял это, и это действительно работает на всех языках SQL.

среда Management studio создает сценарии типа:

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

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

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

нет необходимости использовать преобразование. Просто список указанной даты в формате ISO 8601.
Вот так:

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

разделитель должен быть / и он должен быть окружен один ' цитаты.

Если вы храните значения с помощью любого языка программирования

вот пример в C#

чтобы сохранить дату, вы должны сначала преобразовать ее, а затем сохранить ее

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

FooDate-это переменная datetime, которая содержит вашу дату в вашем формате.

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