SQL - एक varchar डेटा प्रकार के डेटाटाइम डेटा प्रकार में रूपांतरण के परिणामस्वरूप एक आउट-ऑफ-रेंज मान होता है


96

अपने डेटा प्रकार के मान को बदलने के लिए SQL चलाते समय मुझे निम्न त्रुटि हो रही varcharहै datetime

Msg 242, Level 16, State 3, Line 1 एक varchar डेटा प्रकार के डेटाटाइम डेटा प्रकार में परिवर्तित होने के परिणामस्वरूप एक आउट-ऑफ-रेंज मान होता है।

मैंने डेटा की जाँच की है और कुछ भी अजीब नहीं देख सकता है: निम्नलिखित जाँचों को छोड़ दें और सभी कोई परिणाम नहीं दे रहे हैं

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

वहाँ कुछ और देखने लायक है और शायद किसी भी संकेत या इस मुद्दे के साथ मदद के लायक है? इसके नीचे पाने के लिए प्रतीत नहीं कर सकते।


3
डेट कॉलम का डेटा प्रकार क्या है? क्या आप मुझे तालिका स्कीमा दिखा सकते हैं, और यह कथन कि त्रुटि कृपया हो सकती है?
स्पाइकह

3
आपके द्वारा दिए गए छह एसक्यूएल बयानों में से कौन सा विफल रहता है?
मूरिनिक

1
छह कथन सभी कार्य करते हैं और डेटा के साथ कोई समस्या नहीं सत्यापित करते हैं।
user23495

3
आपने गैर-वैध तिथियों जैसे 2013-10-31 या 2013-02-30 के लिए जाँच नहीं की है। संभवतः, आप जिस त्रुटि का सामना कर रहे हैं, वह उस तरह की समस्याग्रस्त तिथियों को संदर्भित करता है
दलेन

2
हाय दलेन, मैंने यह जाँच की है। डेटा सेट करने का तरीका 31/10/2013, 30/10/2013 है। यह ब्रिटेन के प्रारूप में है। क्या किसी कॉलम प्रकार को बदलने की कोशिश करने पर इसका कोई प्रभाव पड़ेगा, ऐसा नहीं लगता।
user23495

जवाबों:


90

मैंने एक हफ्ते पहले भी इसी समस्या का सामना किया है। समस्या समय क्षेत्र सेटिंग के साथ है। Mm / dd / yyyy (आमतौर पर काम करता है) जैसे अन्य स्वरूपों में निर्दिष्ट करें।

दिनांक 30/12/2013 के रूप में निर्दिष्ट करना मेरे लिए त्रुटि थी। हालाँकि, इसे mm / dd / yyyy प्रारूप के रूप में निर्दिष्ट करते हुए काम किया।

यदि आपको अपना इनपुट परिवर्तित करने की आवश्यकता है तो आप CONVERTविधि की तलाश कर सकते हैं । सिंटेक्स है

CONVERT(VARCHAR,@your_date_Value,103)

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

103 का परिष्करण डेटाइम प्रारूप है।

रूपांतरण प्रारूपों और आगे पढ़ने के लिए इस लिंक को देखें। https://www.w3schools.com/sql/func_sqlserver_convert.asp


1
मदद दोस्त के लिए धन्यवाद। मैंने इसे बदलने की कोशिश की, लेकिन फिर भी कोई किस्मत नहीं थी। क्या यह टेबल के कारण हो सकता है अभी भी एक चरचर या कुछ और है जो इसे विफल करने का कारण बन सकता है?
user23495

2
यदि आप अपना नमूना डेटा (जो तालिका में है) पोस्ट करते हैं तो यह बहुत उपयोगी होगा। टिप्पणी में आपने कहा कि आप इसे 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'

और यह ठीक ही निष्पादित करता है।


2
हाँ, मैंने अभी २ ९ फरवरी २०१५ की एक एक्सपायरी डेट पाई है जिस डेटाबेस में मुझे काम करना है। मुझे आश्चर्य है कि यह वहां कैसे पहुंचा। मुझे आश्चर्य है कि वहाँ कितने अधिक हैं ...
संसाधन

4
बस कास्ट (SUBSTRING ([MyDateField], 1,2) पूर्णांक के रूप में)> 31 का इस्तेमाल किया और दिसंबर 60 के दशक के साथ एक रिकॉर्ड पाया। कौन इस सामान में प्रवेश करता है, डॉ। सुसे?
स्टीवकॉव

3
धन्यवाद! यह मेरी समस्या थी। मेरे सेट में कुछ खराब डेटा था - 01/01/1113, हाहा।
सेव09

2
मेरे लिए, मैंने एसक्यूएल स्टेटमेंट बनाने की तारीख को फॉर्मेट करते समय गलत फॉर्मेट स्ट्रिंग लगाई थी। मैंने इस्तेमाल किया था Format(DateTime.Now, "yyyymmdd")जब यह होना चाहिए थाFormat(DateTime.Now, "yyyyMMdd")
जय इमर्मन

1
अर्घ अमेरिकी तिथि सम्मेलनों! मुझे कुछ समय के लिए स्टम्प्ड किया गया था, "26 अक्टूबर 2017" के बाद से। ', '26 -10-2017' पूरी तरह से मान्य तारीख है :)
एंटीमनी

31

मेरा हाल ही में इसी तरह का मुद्दा था। क्षेत्रीय सेटिंग्स को ऐप और डेटाबेस सर्वर दोनों में ठीक से सेटअप किया गया था। हालाँकि, SQL के निष्पादन में परिणाम हुआ

"एक varchar डेटा प्रकार के डेटाटाइम डेटा प्रकार में रूपांतरण के परिणामस्वरूप एक आउट-ऑफ-रेंज मान होता है"।

समस्या db उपयोगकर्ता की डिफ़ॉल्ट भाषा थी।

SSMS में इसे चेक या बदलने के लिए Security -> Logins पर जाएं और प्रश्नों को चलाने वाले उपयोगकर्ता के उपयोगकर्ता नाम पर राइट-क्लिक करें। गुण चुनें -> सामान्य और सुनिश्चित करें कि संवाद के तल पर डिफ़ॉल्ट भाषा वही है जो आप अपेक्षा करते हैं।

सभी उपयोगकर्ता जो क्वेरी चलाते हैं, उनके लिए इसे दोहराएं।


2
इससे मुझे मदद मिली। बस एक छोटा सुधार: डिफ़ॉल्ट भाषा की server loginनहीं db usertop-password.com/blog/…
बाज गुवेंकाया

1
चूंकि यह कार्यक्रम कोड में स्थापित है और मैं कोड के लिए उपयोग नहीं किया है, मैं इसे से बदल Englishकरने के लिए British Englishऔर यह काम किया है!
vaheeds

1
मेरे लिए अंग्रेजी को अंग्रेजी में बदलने के लिए ahd - अली, आप एक जीवन रक्षक हैं!
दाविद-जियोर्गी

10

आप का उपयोग कर सकते हैं

Set dateformat <date-format> ;

आप कार्य करने के लिए कार्य करते हैं या संग्रहीत कार्यविधि करते हैं।



1
इससे मेरी समस्या हल हो गई। मुझे समझ में नहीं आ रहा है कि यह अचानक क्यों होना शुरू हो गया है :(
विक्टरईस्पिना

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

5
कृपया अपने उत्तर में और विवरण जोड़ें। यह आपके उत्तर को अधिक से अधिक समझने में प्रश्नकर्ता की मदद करेगा।
प्रमोद एस। निकम

2

मेरे पास एक ही समस्या है और यह निर्धारित किया गया है कि यह समस्या उत्पन्न होती है क्योंकि SQL सर्वर एक समान तरीके से पूर्णांक में परिवर्तित वर्णों पर तुलना नहीं करता है। मेरे परीक्षण में, मैंने पाया है कि परिवर्तित वर्णों की कुछ तुलनाएं, जैसे कि विस्मयादिबोधक बिंदु, प्रकार रूपांतरण त्रुटियों को लौटा देगा, जबकि परिवर्तित वर्णों की अन्य तुलनाओं, जैसे कि अंतरिक्ष, सीमा से बाहर होना निर्धारित किया जाएगा।

यह नमूना कोड विभिन्न संभावित परिदृश्यों का परीक्षण करता है और नेस्टेड रिप्ले स्टेटमेंट का उपयोग करके एक समाधान प्रस्तुत करता है। 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
+ 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) जिसके कारण 'एक nvarchar डेटा प्रकार को डेटाइम डेटा प्रकार में परिवर्तित करने का परिणाम आउट-ऑफ-द-रेंज मान' त्रुटि थी। सेनेट कंवर्ट (डेटाइम, 'yourdate') से [yourtable] जहां ISDATE ('yourdate') = 1 ने दिन बचा लिया :)
J Pollack

2

मुझे भी इस समस्या का सामना करना पड़ा जब ऑटो एक कॉलम में एक sysdate सम्मिलित करता है।

मैंने जो किया वह मैंने SQL सर्वर की दिनांक प्रारूप के साथ मिलान करने के लिए अपने सिस्टम दिनांक स्वरूप को बदल दिया है। उदाहरण के लिए मेरा SQL प्रारूप mm / dd / yyyy था और मेरे सिस्टम प्रारूप को dd / mm / yyyy पर सेट किया गया था। मैंने अपने सिस्टम प्रारूप को mm / dd / yyyy और त्रुटि में बदल दिया

-kb


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 को मैंने परीक्षण किया और पाया कि SQL सर्वर 2078 तक स्वीकृत है, उस त्रुटि को फेंकना शुरू कर दिया यदि वर्ष 2079 या उससे अधिक है। मैंने आगे कोई शोध नहीं किया है कि एसक्यूएल सर्वर किस तरह की तारीख को खिसकाता है।


1

मैंने बस उस varchar फ़ील्ड को परिवर्तित किया है जिसे मैं एक नई तालिका (पहले दर्ज की गई तारीख के साथ) में पहले DateTime संगत लेआउट में बदलना चाहता था और फिर SQL बिना किसी समस्या के 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
Varchar Date Convert to Date and Change the Format

Nov 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]


0

यह त्रुटि मेरे लिए हुई क्योंकि मैं सी # कोड से सीधे इनलाइन प्रश्नों का उपयोग कर एक कॉलम में न्यूनतम दिनांक और समय संग्रहीत करने का प्रयास कर रहा था।

दिनांक चर को 01/01/0001 12:00:00 पूर्वाह्न को कोड में सेट किया गया था, इस तथ्य को देखते हुए कि C # में DateTime को इस तिथि और समय के साथ आरम्भ किया गया है, यदि नहीं है। और एमएस-एसक्यूएल 2008 डेटाइम टाइपैट में न्यूनतम संभव तारीख 1753-01-01 12:00:00 पूर्वाह्न है।

मैंने कोड से तारीख बदल दी और इसे 01/01/1900 पर सेट कर दिया और आगे कोई त्रुटि नहीं हुई।


0

मैंने एमएम के बजाय मिमी के साथ डेट पर ट्राईरिंग () का उपयोग किया।


0

बस यह सुनिश्चित करें कि आपके डेट्स संगत हैं या आपके डेटाबेस मैनेजर (जैसे SQL सर्वर मैनेजमेंट स्टूडियो) में ठीक से चलाए जा सकते हैं। उदाहरण के लिए, DateTime.Now C # फ़ंक्शन SQL सर्वर में अमान्य है जिसका अर्थ है कि आपकी क्वेरी में SQL सर्वर के लिए GETDATE () जैसे मान्य फ़ंक्शन शामिल हैं।

इस बदलाव ने मेरे लिए पूरी तरह से काम किया है।


0

इस मुद्दे के लिए थोड़ा असामान्य कारण है, लेकिन अगर किसी को इसकी आवश्यकता है तो बस। मैं जिस कोड पर काम कर रहा था, उसका उपयोग कर रहा था:

java.text.DateFormat.getDateTimeInstance()

दिनांक फ़ॉर्मेटर प्राप्त करने के लिए। इस कॉल द्वारा लौटाए गए स्वरूपण पैटर्न को जावा 8 से बदलकर जावा 9 के रूप में इस बग रिपोर्ट में वर्णित किया गया है: https://bugs.openjdk.java.net/browse/JDK-8152154 जाहिरा तौर पर यह मेरे लिए लौट रहा था, यह प्रारूप उपयुक्त नहीं था। डेटाबेस के लिए। समाधान इसके बजाय था:

DateTimeFormatter.ISO_LOCAL_DATE_TIME
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.