Запрос Sql для вставки даты и времени в SQL Server
Я хочу вставить значение 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
Незлая помощь!
Спасибо.
Ответы
Ответ 1
Вы хотите использовать 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
вот стиль итальянских дат. Ну, не только итальянцы, но и культура, которую она приписывала в Интернет-книгах.
Ответ 2
См. Строковые форматы даты и времени в Microsoft TechNet.
Вы можете использовать стандартный формат даты SQL Standard SQL. Согласно приведенной выше ссылке, он обозначается как "многоязычный":
insert into table1(approvaldate) values ('2012-06-18 10:34:09')
Однако это не будет работать на всех языках. Например, здесь приведен быстрый script, который использует динамический 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
Если вы запустите этот script, вы получите много ошибок, например:
Ошибка на языке датский Преобразование типа данных varchar в тип данных datetime приводило к значению вне диапазона.
Более независимый от языка выбор для строковых литералов - это международный стандарт ISO 8601. Этот формат очень похож на стандарт ANSI, за исключением буква "T" между датой и временем:
insert into @TestLang (langdate) values ('2012-06-18T10:34:09')
Я тестировал это, и он действительно работает на всех языках SQL.
Ответ 3
Студия управления создает такие скрипты, как:
insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))
Ответ 4
вам нужно добавить его как
insert into table1(date1) values('12-mar-2013');
Ответ 5
Не нужно использовать конвертировать. Просто перечислите его как цитируемую дату в формате ISO 8601.
Например:
select * from table1 where somedate between '2000/01/01' and '2099/12/31'
Сепаратор должен быть /
, и его нужно окружить одиночными кавычками '
.
Ответ 6
Если вы сохраняете значения через любой язык программирования
Вот пример в С#
Чтобы сохранить дату, вы должны сначала ее преобразовать, а затем сохранить ее
insert table1 (foodate)
values (FooDate.ToString("MM/dd/yyyy"));
FooDate - это переменная datetime, которая содержит вашу дату в вашем формате.
Ответ 7
Я сталкиваюсь с более общей проблемой: получаю разные (и не обязательно известные) форматы datetime и вставляю их в столбец datetime. Я решил это с помощью этого утверждения, которое, наконец, стало скалярной функцией (имеющей отношение к каноническому, американскому, американскому, британскому стилю даты франшизы и расширению):
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)))