2014-11-21 3 views
1

Когда я пытаюсь выполнить этот запросдата Установка в SQL сервере

INSERT INTO StateRegion 
     (FullName , 
      Abbreviation , 
      RegionType , 
      Admitted , 
      Capital 
     ) 
VALUES ('Alabama' , 
      'AL' , 
      1 , 
      '1819-Dec-14' , 
      'Montgomery' 
     ); 

это дает мне ошибку Ошибка преобразования даты SQL:

Конверсия удалось при преобразовании даты и/или времени из символов строки

Допустимый тип даты.

Проблема в том, что я не могу изменить этот формат: 1819-Dec-14, можно ли добавить метод преобразования к указанному выше запросу?

определение Таблица:

CREATE TABLE StateRegion 
(
    ID   bigint  PRIMARY KEY IDENTITY(1,1), 
    FullName  varchar(50) NOT NULL, 
    Abbreviation varchar(2) NOT NULL, 
    RegionType smallint  NOT NULL, 
    Admitted  date   NULL, 
    Capital  varchar(50) NULL 
); 
+0

Неужели это когда-либо работало или оно просто прекратило работать? –

+0

Он должен работать! –

+0

Это не сработало, строка не была вставлена ​​ –

ответ

6

Часть названия месяца этого формата даты интерпретируется в соответствии с языком входа.

Вы можете изменить язык по умолчанию входа в американском английском или британском английском, если вы должны работать с этим форматом или выдать

Set language english 

Чтобы установить формат во время выполнения до проблемного запроса, по выбору переключателя это потом.

Если у вас есть выбор с использованием yyyy-mm-dd или yyyymmdd, предпочтительными форматами для литературных дат, хотя и избегать этой проблемы при литье до date.

-1

Использование параметризованных запросов. Параметризация отправит дату на сервер в двоичном формате, избегая любых преобразований строк, которые зависят от локали клиента.

Пример в C#:

SqlCommand sqc = new SqlCommand("INSERT INTO MyTable (DateColumn) VALUES (@date)", con); 
sqc.Parameters.AddWithValue("@date", new DateTime(1819, 12, 14)); 

Если вы работаете в этом из интерактивной партии (SQL Management Server Studio или аналогичный), используйте SET LANGUAGE для обеспечения даты обрабатываются правильно:

SET LANGUAGE ENGLISH; 

INSERT INTO StateRegion (FullName, Abbreviation, RegionType, Admitted, Capital) 
VALUES ('Alabama', 'AL', 1, '1819-Dec-14', 'Montgomery'); 

SqlFiddle example showing correct parsing

+1

Вопрос не помечен C#, зачем использовать его? – Lamak

+0

@Lamak, потому что это самый распространенный клиент для SQL Server, если он не выполняется через интерактивный интерфейс. – Mitch

-2

Вы можете попытаться использовать явный формат для преобразования. Вы не объясняете , почему вы не можете изменить формат, но я полагаю, что вы как-то читаете значения, которые уже хранятся. Вы можете использовать CONVERT:

DECLARE @Admitted VARCHAR(11); 
SET @Admitted = '1819-Dec-14' 


SELECT CONVERT(DATETIME,RIGHT(@Admitted,2)+' '+ 
         SUBSTRING(@Admitted,6,3)+' '+ 
         LEFT(@Admitted,4),106); 
0

Не следует путать формат хранения и формат отображения. Просто потому, что сервер хранит дату в базе данных как «1819-12-14», вы можете использовать пользовательский вывод форматирования для отображения. Тогда правильно для выдачи отображения с такой функцией, как:

CREATE FUNCTION usp_FormatedDateString (@Date Date) 
RETURNS VARCHAR(50) 
AS 
BEGIN 
    DECLARE @RETURN AS VARCHAR(50) 
    DECLARE @I INT = 0 
    DECLARE @M AS VARCHAR(100) = 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC' 
    SET @RETURN = CAST(DATEPART(YEAR,@Date) AS VARCHAR(4)) 
    SET @I = DATEPART(MONTH, @Date) - 1 
    SET @RETURN = @RETURN + '-' + SUBSTRING(@M,(@I*3)+1,3)+'-'+ CAST (DATEPART(DAY,@Date) AS VARCHAR(2)) 
    RETURN @RETURN 
END 
GO 

Тогда при отображении результатов:

SELECT FullName,Abbreviation,RegionType, dbo.usp_FormatedDateString (Admitted) as Admitted, Capital FROM StateRegion 

Он будет отображаться правильно и хранить правильно.

Смежные вопросы