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