Запрос 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)))