এসকিউএল - একটি তারিখের ডেটা টাইপের একটি বার্চার ডেটা ধরণের রূপান্তরকরণের ফলে সীমার বাইরে মানের মান ঘটে


95

যখন একটি এসকিউএল থেকে আমার ডাটা টাইপ মান রূপান্তর করতে চলমান আমি নিম্নলিখিত ত্রুটি পেয়ে হয়েছে varcharথেকে datetime

এমএসজি 242, স্তর 16, রাজ্য 3, লাইন 1 একটি তারিখের ডেটা টাইপের একটি ভারচর ডেটা ধরণের রূপান্তরকরণের ফলে সীমার মান ছাড়িয়েছে।

আমি ডেটা পরীক্ষা করে দেখেছি এবং অদ্ভুত কোনও কিছুই দেখতে পাচ্ছি না: নীচের চেকগুলি চালান এবং সমস্ত ফলাফলই ফিরে আসেনি

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

এই সমস্যাটির সাথে দেখার মতো এবং সম্ভবত কোনও পয়েন্টার বা সহায়তা করার মতো আরও কিছু আছে কি? এর নিচে পাওয়া যাবে বলে মনে হচ্ছে না।


4
তারিখ কলামের ডেটা ধরণ কী? আপনি কি আমাকে টেবিল স্কিমা এবং বিবৃতিটি দেখাতে পারেন যে ত্রুটিটি দয়া করে ঘটে?
স্পিकेহ

4
আপনার সরবরাহিত ছয়টি এসকিউএল বিবৃতিগুলির মধ্যে কোনটি ব্যর্থ হয়েছে?
মুরিনিক

4
ছয়টি বিবৃতি সমস্ত কাজ করে এবং ডেটা নিয়ে কোনও সমস্যা যাচাই করে না।
ব্যবহারকারী 23495

4
আপনি বৈধ তারিখগুলি যেমন 2013-10-31 বা 2013-02-30 হিসাবে পরীক্ষা করেছেন। সম্ভবত, আপনি যে ত্রুটির মুখোমুখি হয়েছিলেন, সেই ধরণের সমস্যাযুক্ত তারিখগুলি বোঝায়
ড্যালেন

4
হাই ড্যালেন, আমি এই চেকটি করে ফেলেছি। যেভাবে ডেটা সেট আপ করা হয়েছে তা 31/10/2013, 30/10/2013 /10 এটি ইউকে ফর্ম্যাটে। কলামের ধরণের পরিবর্তন করার চেষ্টা করার পরে কি এটির কোনও প্রভাব পড়বে, তা ভাবেনি।
ব্যবহারকারী 23495

উত্তর:


90

এক সপ্তাহ আগেও আমি একই সমস্যার মুখোমুখি হয়েছি। সমস্যাটি সময় অঞ্চল নির্ধারণের সাথে। মিমি / ডিডি / ইয়িআই (সাধারণত কাজ করে) এর মতো অন্যান্য ফর্ম্যাটগুলিতে উল্লেখ করুন।

30/12/2013 হিসাবে তারিখটি উল্লেখ করা আমার জন্য ত্রুটির কারণ হয়েছিল। তবে এটি মিমি / ডিডি / ইয়াই ফর্ম্যাট হিসাবে উল্লেখ করে as

আপনার ইনপুটটিকে রূপান্তর করতে হলে আপনি CONVERTপদ্ধতিটি দেখার চেষ্টা করতে পারেন । সিনট্যাক্স হয়

CONVERT(VARCHAR,@your_date_Value,103)

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

সমাপ্তি 103 তারিখের সময় ফর্ম্যাট।

রূপান্তর ফর্ম্যাট এবং আরও পড়ার জন্য এই লিঙ্কটি দেখুন। https://www.w3schools.com/sql/func_sqlserver_convert.asp


4
সহযোগী সাথীর জন্য ধন্যবাদ। আমি এটি রূপান্তর করার চেষ্টা করেছি কিন্তু এখনও কোনও ভাগ্য নেই। এটি কি টেবিলের কারণে কোনও বার্চার স্টিল বা অন্য কিছু হতে পারে যা এটি ব্যর্থ হতে পারে?
ব্যবহারকারী 23495

4
আপনি যদি আপনার নমুনা ডেটা (টেবিলের মধ্যে থাকে) পোস্ট করেন তবে এটি অনেক সহায়ক হবে। মন্তব্যে আপনি বলেছিলেন যে আপনি এটি yyyy-mm-dd ফর্ম্যাটে চান। সুতরাং, এই চেষ্টা করুন SELECT CONVERT(char(10), GetDate(),126)। প্রয়োজনীয় মান সহ কেবল GETDATE () প্রতিস্থাপন করুন ।
মাহে

61

মূর্খ ভুলের কারণে আমি এই ইস্যুতে ছুটে এসেছি। তারিখটি আসলেই রয়েছে তা নিশ্চিত করুন!

উদাহরণ স্বরূপ:

31 সেপ্টেম্বর, 2015 এর অস্তিত্ব নেই।

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

সুতরাং এই বার্তাটি ব্যর্থ:

Error converting data type varchar to datetime.

এটি ঠিক করতে, একটি বৈধ তারিখ ইনপুট করুন:

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

এবং এটি ঠিক জরিমানা কার্যকর।


4
হ্যাঁ, আমাকে কাজ করতে হবে এমন ডেটাবেজে আমি সবেমাত্র 29 ফেব্রুয়ারী 2015 এর একটি মেয়াদ শেষ হয়েছি। আমি ভাবলাম কীভাবে এটি সেখানে gotুকল। আমি আরও কতজন সেখানে আশ্চর্য হয়েছি ...
রিসোর্স

4
পূর্ণসংখ্যক হিসাবে সাস্ট্রিং ([মাইডেটফিল্ড], 1,2) সবেমাত্র ব্যবহৃত হয়েছে> 31 এবং 60 ডিসেম্বরের সাথে একটি রেকর্ড খুঁজে পেয়েছেন। ডাঃ স্যস, কে এই স্টাফ প্রবেশ করে?
স্টিভকাভ

4
ধন্যবাদ! এটা আমার সমস্যা ছিল। আমার সেটে আমার কিছু খারাপ ডেটা ছিল - 01/01/1113, হাহা।
সেভ ০৯

4
আমার জন্য, এসকিউএল স্টেটমেন্টটি তৈরির তারিখ ফর্ম্যাট করার সময় আমি ভুল ফর্ম্যাট স্ট্রিংটি রেখেছিলাম। Format(DateTime.Now, "yyyymmdd")যখন এটি হওয়া উচিত ছিল তখন আমি ব্যবহার করেছিলামFormat(DateTime.Now, "yyyyMMdd")
জে ইমারম্যান 12'17

4
আরগের আমেরিকান তারিখের সম্মেলন! "26 শে অক্টোবর 2017" যেহেতু, '26 -10-2017 'পুরোপুরি বৈধ তারিখ থেকে আমাকে কিছুক্ষণের জন্য স্টাম্প করে ফেলেছিল :)
অ্যান্টিমনি

31

আমি সম্প্রতি একই সমস্যা ছিল। আঞ্চলিক সেটিংস অ্যাপ্লিকেশন এবং ডাটাবেস সার্ভার উভয়ই সঠিকভাবে সেটআপ করা হয়েছিল। তবে এসকিউএল কার্যকর করার ফলস্বরূপ

"একটি তারিখের ডেটা টাইপটিতে একটি ভারচার ডেটা টাইপের রূপান্তরকরণের ফলে সীমার বাইরে মানের মান আসে"।

সমস্যাটি ছিল ডিবি ব্যবহারকারীর ডিফল্ট ভাষা।

এসএসএমএসে এটি পরীক্ষা বা পরিবর্তন করতে সুরক্ষা -> লগইনগুলিতে যান এবং অনুসন্ধানগুলি চালিত ব্যবহারকারীর ব্যবহারকারীর নামটিতে ডান ক্লিক করুন। বৈশিষ্ট্যগুলি -> সাধারণ নির্বাচন করুন এবং ডায়ালগের নীচে ডিফল্ট ভাষাটি আপনার প্রত্যাশাটি তা নিশ্চিত করুন।

ক্যোরি চালানো সমস্ত ব্যবহারকারীর জন্য এটি পুনরাবৃত্তি করুন।


4
এটি আমাকে সাহায্য করেছিল। শুধু একটি ছোট সংশোধন: এর ডিফল্ট ভাষা server loginনা db userশীর্ষ- পাসওয়ার্ড.com
বাজ গুভেনকায়া

4
যেহেতু এটা প্রোগ্রাম কোডে সেট এবং আমি কোডটি এক্সেস আছে না, আমি তা থেকে পরিবর্তিত Englishকরা British Englishএবং এটা কাজ হচ্ছে!
vaheeds

4
আমার পক্ষে আহ্ ইংরেজিকে ব্রিটিশ ইংরেজিতে রূপান্তরিত করার জন্য - আলী, আপনি জীবন রক্ষাকারী!
ডেভিড-জিওরগি

10

আপনি এর ব্যবহার করতে পারেন

Set dateformat <date-format> ;

আপনার এসপি ক্রিয়াকলাপে বা জিনিসগুলি সম্পন্ন করার জন্য সঞ্চিত পদ্ধতি।



4
এটি আমার সমস্যার সমাধান করেছে। আমি যা বুঝতে পারি না কেন এটি হঠাৎ ঘটতে শুরু করে :(
ভিক্টরস্পিনা

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

4
আপনার উত্তর আরও বিবরণ যোগ করুন। এটি আপনার উত্তরটি আরও আঁকতে প্রশ্নকারীকে সহায়তা করবে।
প্রমোদ এস নিকম

2

আমি একই সমস্যা পেয়েছি এবং নির্ধারণ করেছি যে এই সমস্যাটি দেখা দেয় কারণ এসকিউএল সার্ভারটি একটি অভিন্ন পদ্ধতিতে রূপান্তরিত অক্ষরের সাথে তুলনা করে না। আমার পরীক্ষায়, আমি দেখতে পেয়েছি যে রূপান্তরিত অক্ষরের কিছু তুলনা যেমন বিস্মরণবোধক পয়েন্ট, ধরণের রূপান্তর ত্রুটিগুলি ফিরিয়ে দেবে, অন্যদিকে রূপান্তরিত অক্ষরের যেমন তুলনামূলকভাবে স্থানটি সীমার বাইরে থাকবে তা নির্ধারিত হবে।

এই নমুনা কোডটি বিভিন্ন সম্ভাব্য পরিস্থিতিগুলি পরীক্ষা করে এবং নেস্টেড REPLACE বিবৃতি ব্যবহার করে একটি সমাধান উপস্থাপন করে। REPLACE নির্ধারণ করে যে স্ট্রিংয়ে এমন কোনও অক্ষর রয়েছে যা অঙ্ক বা স্ল্যাশ নয় এবং যদি উপস্থিত থাকে তবে স্ট্রিংটির দৈর্ঘ্য শূন্যের চেয়ে বেশি হবে, যার ফলে সেখানে 'খারাপ' অক্ষর রয়েছে এবং তারিখটি অবৈধ রয়েছে ating ।

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
+ 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 @date=@firstpart+'/'+@Secondpart+'/'+@Thirdpart
insert into @output(splitdata) values(
@date)


return
End

'19610010' তারিখের স্ট্রিং সহ একটি সমস্যাযুক্ত সারি ছিল (ফর্ম্যাট: YYYYMMDD) যার ফলে 'একটি এনভারচর ডেটা টাইপকে ডেটটাইম ডেটা টাইপের রূপান্তরকরণের ফলে একটি সীমার বাইরে থাকা মান' ত্রুটির ফলস্বরূপ। কনভার্টটি নির্বাচন করুন (তারিখের সময়, 'আপনার তারিখ') থেকে [আপনার টেবিল] কোথায় আপডেট ('আপনার তারিখ') = 1 দিন বাঁচিয়েছে :)
জে পোল্যাক

2

একটি কলামে স্বয়ংক্রিয়ভাবে সিসডেট whileোকানোর সময় আমিও এই সমস্যার মুখোমুখি হয়েছি।

আমি যা করেছি তা হ'ল আমি এসকিউএল সার্ভারের তারিখের ফর্ম্যাটটির সাথে মেলে আমার সিস্টেমের তারিখের ফর্ম্যাটটি পরিবর্তন করেছি। যেমন আমার এসকিউএল ফর্ম্যাটটি মিমি / ডিডি / ইয়াই ছিল এবং আমার সিস্টেম ফর্ম্যাটটি ডিডি / মিমি / ইয়াই সেট করা হয়েছিল। আমি আমার সিস্টেমের ফর্ম্যাটটি মিমি / ডিডি / ইয়াইতে পরিবর্তন করেছি এবং ত্রুটি চলে গেছে

-কেবি


2

আপনি জানেন যে এটি ইউকে ফর্ম্যাট সমস্যা। আপনি ফাংশন ব্যবহার করে অপ্রত্যক্ষভাবে তারিখ রূপান্তর করতে পারেন।

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

এটিকে সাধারণত ডেটটাইমে রূপান্তর করুন

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

আপনার ক্ষেত্রে, আপনি করতে পারেন

SELECT [dates] from table where CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) > GetDate()   -- or any date

2

বছরের জন্য পরীক্ষা> 2079. আমি দেখতে পেয়েছি যে একজন ব্যবহারকারী ২০১ 2016 (10/12/2106) এর পরিবর্তে ২০১০ এর পরিবর্তে 2106 টাইপ করেছেন এবং গুমগজ হয়েছে; সুতরাং 10/12/2016 তে আমি এসকিউএল সার্ভারকে পরীক্ষা করেছি এবং 2078 অবধি গ্রহণ করেছি, বছরটি 2079 বা তার চেয়ে বেশি হলে ত্রুটিটি ছুঁড়তে শুরু করেছি। এসকিউএল সার্ভার কী ধরনের তারিখ স্লাইড করে তা নিয়ে আমি আর কোনও গবেষণা করিনি।


1

আমি কেবল বর্ণাখার ক্ষেত্রটি রূপান্তর করতে চেয়েছিলাম যা আমি একটি নতুন টেবিলের সাথে রূপান্তর করতে চেয়েছিলাম (একটি ডেটটাইম দায়ের করা) প্রথমে একটি ডেটটাইম সামঞ্জস্যপূর্ণ বিন্যাসে রূপান্তর করতে এবং তারপরে এসকিউএল সমস্যা ছাড়াই বারচর থেকে ডেটটাইমে রূপান্তরটি করব।

নীচে (এই নামগুলির সাথে আমার তৈরি টেবিলটি নয়!) আপনি যদি চান তবে আমি কেবল বর্ণচর ক্ষেত্রটিকে একটি ডেটটাইম চেহারা হিসাবে তৈরি করতে চাই:

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
Varchar Date Convert to Date and Change the Format

নভেম্বর 12 2016 12:00, 21/12/2016, 21-12-2016 এই ফর্ম্যাটটি ডিডি / এমএম / ইয়াইতে পরিবর্তন করতে উপরের জন্য এই ক্যোয়ারী কাজ করে SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]


0

এই ত্রুটিটি আমার জন্য ঘটেছিল কারণ আমি সরাসরি সি # কোড থেকে ইনলাইন কোয়েরি ব্যবহার করে একটি কলামে ন্যূনতম তারিখ এবং সময় সঞ্চয় করার চেষ্টা করছিলাম।

তারিখের পরিবর্তনশীলটি 01/01/0001 12:00:00 এএম কোডে সেট করা হয়েছিল যে সি # তে ডেটটাইমটি এই তারিখ এবং সময় দিয়ে আরম্ভ না করা থাকলে শুরু করা হয় given এবং এমএস-এসকিউএল ২০০ date তারিখের সময়কালীন ডেটাটাইপে অনুমোদিত সর্বনিম্ন সম্ভাব্য তারিখটি 1753-01-01 12:00:00 পূর্বাহ্ন।

আমি কোডটি থেকে তারিখটি পরিবর্তন করে এটিকে 01/01/1900 এ সেট করে দিয়েছি এবং আরও কোনও ত্রুটি রিপোর্ট করা হয়নি।


0

আমি এমএমের পরিবর্তে মিমি সহ একটি তারিখে টোস্ট্রিং () ব্যবহার করেছি।


0

কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনার তারিখগুলি সামঞ্জস্যপূর্ণ বা আপনার ডাটাবেস পরিচালক (যেমন এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও) তে সঠিকভাবে চালানো যেতে পারে। উদাহরণস্বরূপ, ডেটটাইম.নিউ সি # ফাংশন এসকিউএল সার্ভারে অবৈধ, যার অর্থ আপনার কোয়েরিতে এসকিউএল সার্ভারের জন্য GETDATE () এর মতো বৈধ ফাংশন অন্তর্ভুক্ত থাকতে হবে।

এই পরিবর্তনটি আমার পক্ষে পুরোপুরি কার্যকর হয়েছে।


0

এই সমস্যাটির জন্য সামান্য অস্বাভাবিক কারণ তবে যদি কারওর প্রয়োজন হয়। আমি যে কোডে কাজ করছিলাম সেটি ব্যবহার করছিল:

java.text.DateFormat.getDateTimeInstance()

একটি তারিখ বিন্যাস পেতে। এই বাগের মাধ্যমে ফিরে আসা ফর্ম্যাটিং প্যাটার্নটি জাভা 8 থেকে জাভা 9-তে পরিবর্তিত হয়েছে যেমন এই বাগ রিপোর্টটিতে বর্ণিত হয়েছে: https://bugs.openjdk.java.net/browse/JDK-8152154 সম্ভবত আমার জন্য ফর্ম্যাটিংটি ফিরে আসছিল এটি উপযুক্ত ছিল না ডাটাবেসের জন্য। পরিবর্তে এর সমাধানটি ছিল:

DateTimeFormatter.ISO_LOCAL_DATE_TIME
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.