it-swarm.com.ru

SQL - преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона

Я получаю следующую ошибку при запуске SQL для преобразования значения моего типа данных из varchar в datetime.

Сообщение 242, уровень 16, состояние 3, строка 1 Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.

Я проверил данные и не вижу ничего странного: запустил следующие проверки и все не вернули результатов

SELECT [Date] from table where [DATe] is null
SELECT [Date] from table where [DATe] = ''
SELECT [Date] from table where LEN([date])> 10
SELECT [Date] from table where LEN([date])< 10
SELECT top 100 [Date] , SUBSTRING([date],4,2) from [table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 12
SELECT top 100 [Date] , SUBSTRING([date],1,2) from table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 31

Есть ли что-то еще, на что стоит обратить внимание, и, может быть, стоит упомянуть или помочь с этой проблемой? Кажется, не могу понять это.

58
user23495

Я столкнулся с той же проблемой неделю назад. Проблема с настройкой часового пояса. Укажите в других форматах, таких как мм/дд/гггг (обычно работает). 

Указание даты как 30/12/2013 привело к ошибке для меня. Однако указание его в формате мм/дд/гггг сработало. 

Если вам нужно преобразовать входные данные, попробуйте поискать метод CONVERT . Синтаксис

CONVERT(VARCHAR,@your_date_Value,103)

CONVERT(VARCHAR, '12/30/2013', 103)

Окончание 103 - формат даты и времени. 

Перейдите по этой ссылке для получения информации о форматах конвертации и дополнительной информации . http://www.w3schools.com/sql/func_convert.asp

56
Mahe

Я столкнулся с этой проблемой из-за глупой ошибки. Убедитесь, что дата действительно существует!

Например:

31 сентября 2015 года не существует.

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150931'

Так что это не с сообщением:

Error converting data type varchar to datetime.

Чтобы исправить это, введите правильную дату:

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150930'

И это выполняется просто отлично.

45
Mr. C

У меня недавно была похожая проблема. Региональные настройки были правильно настроены как в приложении, так и на сервере базы данных. Однако выполнение SQL привело к 

Msgstr "Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона". 

Проблема была в языке по умолчанию для пользователя базы данных.

Чтобы проверить или изменить его в SSMS, зайдите в Security -> Logins и щелкните правой кнопкой мыши имя пользователя, который выполняет запросы. Выберите свойства -> общие и убедитесь, что языком по умолчанию в нижней части диалогового окна является то, что вы ожидаете.

Повторите это для всех пользователей, которые выполняют запросы.

15
ali

Вы можете использовать 

Set dateformat <date-format> ;

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

7
Sachin Mishra
Create procedure [dbo].[a]

@examdate varchar(10) ,
@examdate1 varchar(10)
AS
Select tbl.sno,mark,subject1,
Convert(varchar(10),examdate,103) from tbl
where 
(Convert(datetime,examdate,103)  >= Convert(datetime,@examdate,103) 
and (Convert(datetime,examdate,103) <=  Convert(datetime,@examdate1,103)))
3
sonu yadav

Я тоже столкнулся с этой проблемой при автоматической вставке sysdate в столбец.

Я изменил формат системной даты, чтобы он соответствовал формату даты сервера SQL . Egmy Формат SQL был mm/dd/yyyy, а системный формат был установлен на dd/mm/yyyy . Я изменил свой системный формат на мм/дд/гггг и ошибка исчезла

-kb

2
user5714464

У меня была та же проблема, и я решил, что эта проблема возникает из-за того, что SQL Server не выполняет сравнения символов, преобразованных в целые числа идентичным образом. В моем тесте я обнаружил, что некоторые сравнения преобразованных символов, такие как восклицательный знак, будут возвращать ошибки преобразования типов, в то время как другие сравнения преобразованных символов, такие как пробел, будут определены как находящиеся вне диапазона.

Этот пример кода тестирует различные возможные сценарии и представляет решение с использованием вложенных операторов REPLACE. REPLACE определяет, есть ли в строке какие-либо символы, которые не являются цифрами или косой чертой, и, если таковые имеются, длина строки будет больше нуля, что указывает на наличие «плохих» символов и неправильной даты ,.

DECLARE @str varchar(10)
SET @str = '12/10/2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
    PRINT @str+': Passed Test'
    ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/10/2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string
PRINT ''
GO

DECLARE @str varchar(10)
SET @str = '12/!0/2012'
    IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
        PRINT @str+': Passed Test'
        ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/!0/2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string
PRINT ''
GO

DECLARE @str varchar(10)
SET @str = '12/  /2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
    PRINT @str+': Passed Test'
    ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/  /2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string

Результат:

--Output
--12/10/2012: Passed Test
--Number of characters in 12/10/2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 0

--Msg 245, Level 16, State 1, Line 4
--Conversion failed when converting the varchar value '!0' to data type int.
--Number of characters in 12/!0/2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 1

--12/  /2012: Failed Test
--Number of characters in 12/  /2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 2
2
RSax

Тест на год> 2079 . Я обнаружил, что пользователь набрал 2106 вместо 2016 года (10/12/2106) и boom; поэтому 10/12/2016 я проверил и обнаружил, что SQL Server принят до 2078 года, начал выдавать эту ошибку, если год 2079 или выше. Я не проводил никаких дальнейших исследований относительно того, какой тип SQL Server используется для скольжения дат.

2
gordon

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

CREATE FUNCTION  ChangeDateFormatFromUK
( 
   @DateColumn varchar(10)
)

RETURNS VARCHAR(10)
AS 
 BEGIN
    DECLARE @Year varchar(4), @Month varchar(2), @Day varchar(2), @Result varchar(10)
    SET @Year = (SELECT substring(@DateColumn,7,10))
    SET @Month = (SELECT substring(@DateColumn,4,5)) 
    SET @Day = (SELECT substring(@DateColumn,1,2))
   SET @Result  = @Year  + '/' @Month + '/' +  @Day

 RETURN @Result
END

Для вызова этой функции 

SELECT dbo.ChangeDateFormatFromUK([dates]) from table

Преобразуйте это обычно в datetime

SELECT CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) from table

В вашем случае вы можете сделать 

SELECT [dates] from table where CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) > GetDate()   -- or any date
2
Sumit
+ this happens because sql sometimes doesn't recognize dd/mm/yyyy format
+ so we should always check if the input string is a valid date or not and the accordingly convert it to mm/dd/yyyy and so , i have shown below how it can be done, i have created a function to rearrange in mm/dd/yyyy from dd/mm/yyyy

select case when isdate('yourdate')=1 then CAST('yourdate' AS datetime) 
  else (select * from dbo.fn_convertdate(yourdate))

Create function dbo.fn_convertdate( @Stringdate nvarchar(29))
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
)
Begin
Declare @table table(id int identity(1,1), data varchar(255))
Declare @firstpart nvarchar(255)
Declare @tableout table(id int identity(1,1), data varchar(255))

Declare @Secondpart nvarchar(255)
Declare @Thirdpart nvarchar(255)

declare @date datetime

insert into @table
select * from dbo.fnSplitString(@Stringdate,'/')
select @firstpart=data from @table where id=2
select @Secondpart=data from @table where id=1
select @Thirdpart=data from @table where id=3
set @[email protected]+'/'[email protected]+'/'[email protected]
insert into @output(splitdata) values(
@date)


return
End
1
shashank m
Varchar Date Convert to Date and Change the Format

12 ноября 2016 г. 12:00, 21/12/2016, 21-12-2016 Этот запрос работает для изменения указанного выше формата dd/MM/yyyy SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]

1
Khalid

Я просто преобразовал поле varchar, которое я хотел преобразовать, в новую таблицу (с полем DateTime) сначала в совместимый с DateTime макет, а затем SQL без проблем выполнит преобразование из varchar в DateTime. 

Ниже (не моя созданная таблица с этими именами!) Я просто делаю поле varchar похожим на DateTime, если вы хотите: 

update report1455062507424 
set [Move Time] = substring([Move Time], 7, 4) + '-'+ substring([Move Time], 4, 2) + '-'+ substring([Move Time], 1, 2) + ' ' + 
    substring([Move Time], 12, 5)  
1
Andre

Эта ошибка произошла для меня, потому что я пытался сохранить минимальную дату и время в столбце, используя встроенные запросы непосредственно из кода C #. 

Переменная date была установлена ​​на 01/01/0001 12:00:00 AM в коде, учитывая тот факт, что DateTime в C # инициализируется с этой датой и временем, если не установлено иначе. И наименее возможная дата, допустимая в типе данных datetime MS-SQL 2008, - 1753-01-01 12:00:00. 

Я изменил дату из кода и установил ее на 01.01.1900, и об ошибках больше не сообщалось.

0
Talha Imam

Я использовал ToString () на дату с мм вместо MM.

0
L0uis

Просто убедитесь, что ваши даты совместимы или могут правильно работать в вашем менеджере баз данных (например, SQL Server Management Studio). Например, функция DateTime.Now C # недопустима на сервере SQL, что означает, что ваш запрос должен включать допустимые функции, такие как GETDATE () для SQL Server.

Это изменение отлично сработало для меня.

0
Tonderai Muchada