2014-10-16 4 views
-2

У меня есть таблица, в которой хранится информация о дате в nvarchar в формате (dd/mm/yyyy), когда я конвертирую этот столбец в datetime с помощью Convert (nvarchar (100), dt, 101) it не имеет какой-либо вопрос, однако, когда я хочу, чтобы выбрать верхние строки х от нее хотел, я получил следующее сообщение об ошибке:Ошибка преобразования арифметического переполнения datetime

Msg 8115, Level 16, State 2,Arithmetic overflow error converting expression to data type datetime.

Ниже приведен пример моего кода:

declare @d as nvarchar(100); 
SET @d='20/11/2012' 

SELECT 
    top 1 @d, 
    (select date_diff = DATEDIFF(
     day, 
     CAST(Convert(nvarchar(100), @d, 101) as DateTime), 
     '2014-10-01 00:00:00')) d 
+0

«Я получаю страх» не является описанием проблемы (на самом деле, «террор» - это даже не слово). Какую ** конкретную ошибку ** вы получаете? Вопросы должны быть конкретными, и у вас есть информация об ошибках прямо перед вами - почему вы не включили ее в свой вопрос, чтобы у нас тоже было это? (Помните, что для будущих вопросов.) –

ответ

2

это просто SQL интерпретирует первое время в качестве 11-го числа 20-го месяца в 2012 году.

Попробуйте использовать один из форматов даты preferred.

Мой предпочтительный формат является dd-MMM-yyyy, потому что она никогда не неоднозначной:

declare @d as nvarchar(100); 
SET @d='20-Nov-2012' 


SELECT 
    top 1 @d, 
    (select date_diff = DATEDIFF(
     day, 
     CAST(Convert(nvarchar(100), @d, 101) as DateTime), 
     '01-OCt-2014 00:00:00')) d 

SQL выбирает date format на основе языка.

Вы также можете быть явными и сказать ему, чтобы использовать формат dmy в запросе, как так:

SET DATEFORMAT 'dmy' 

Основываясь на комментарии ниже я умозаключение этого вида запроса:

--Pretending to be some table in the database with varchar dates :(
create table #test (dt varchar(100)) 
insert #test values ('20/11/2012') 


SET DATEFORMAT 'dmy' --Works 
--SET DATEFORMAT 'mdy' --Doesn't Work 

SELECT 
    top 1 dt, 
    (select date_diff = DATEDIFF(
     day, 
     CAST(Convert(nvarchar(100), dt, 101) as DateTime), 
     '2014-10-01 00:00:00')) d 
from #test 

drop table #test 

Но в этом случае, когда мы выбираем дату varchar из таблицы, это указывает на правильность формата даты. Попробуйте тестирование с отличным dateformat s.

+0

Моя проблема - это хранилище данных в базе данных в этом формате '20/11/2012 '. – NR65

+0

Итак, '@ d' - значение, выбранное из другого запроса/таблицы? Постскриптум Вот почему вы никогда не должны хранить даты как varchar's;) – DaveShaw

+0

@ NR65 - обновляет мой ответ – DaveShaw