Подтвердить что ты не робот

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

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

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

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

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

Есть ли что-нибудь еще, что стоит посмотреть и, может быть, стоит каких-либо указателей или помочь с этой проблемой? Похоже, что он не получил его.

4b9b3361

Ответ 1

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

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

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

CONVERT(VARCHAR,@your_date_Value,103)

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

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

Перейдите по этой ссылке для преобразования форматов и дальнейшего чтения. https://www.w3schools.com/sql/func_sqlserver_convert.asp

Ответ 2

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

Например:

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

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

Итак, это не удается с сообщением:

Error converting data type varchar to datetime.

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

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

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

Ответ 3

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

"Преобразование типа данных varchar в тип данных datetime приводит к значению вне диапазона".

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

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

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

Ответ 4

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

Set dateformat <date-format> ;

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

Ответ 5

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)))

Ответ 6

У меня была такая же проблема, и я решил, что эта проблема возникает из-за того, что 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

Ответ 7

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

Что я сделал, я изменил формат своей системы, чтобы соответствовать формату даты SQL-сервера. например мой формат SQL был mm/dd/yyyy, а мой системный формат был установлен на dd/mm/yyyy. Я изменил свой системный формат на mm/dd/yyyy и пропала ошибка

-kb

Ответ 8

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

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

Ответ 9

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

Ответ 10

+ 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

Ответ 11

Я просто преобразовал поле 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)  

Ответ 12

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]

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

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

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

Ответ 16

Я также получаю ту же ошибку, но раньше это работает нормально, но сегодня это дает мне ошибку для того же кода