এসকিউএল সার্ভারে ডেটটাইম সন্নিবেশ করানোর জন্য এসকিএল কোয়েরি


133

আমি datetimeনীচে এসকিএল কোয়েরি ব্যবহার করে একটি সারণীতে (এসকিউএল সার্ভার) একটি মান সন্নিবেশ করতে চাই

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

তবে আমি এই ত্রুটিটি পেয়েছি। Incorrect syntax near '10'.

আমি উদ্ধৃতি দিয়ে চেষ্টা করেছি

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

আমি এই ত্রুটি বার্তা পেয়েছি Cannot convert varchar to datetime

দয়া করে সাহায্য করুন! ধন্যবাদ।

উত্তর:


229

আপনি এসকিউএল সার্ভারে দ্ব্যর্থহীন তারিখ নির্ধারণের জন্য ওয়াইওয়াইওয়াইএমএমডিডি ব্যবহার করতে চাইবেন।

insert into table1(approvaldate)values('20120618 10:34:09 AM');

আপনি যদি dd-mm-yy hh:mm:ss xmফর্ম্যাটে বিবাহিত হন তবে আপনাকে নির্দিষ্ট স্টাইলে কনভার্ট ব্যবহার করতে হবে।

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5এখানে ইতালিয়ান তারিখের জন্য স্টাইল। ঠিক আছে, কেবল ইতালীয়ই নয়, এটি সংস্কৃতি এটি বুকস অনলাইনে দায়ী ।


1
আপনাকে ধন্যবাদ .. এটি কাজ করে। বিডিডাব্লু কি ডিডি-এমএম-ওয়াই ফর্ম্যাটে প্রবেশ করা সম্ভব নয়?
শী

@RichardTheKiwi কি 5বোঝান?
শী

@ শিয়ে উত্তর যোগ করার জন্য পাদলেখ দেখুন
রিচার্ড

4
আমি সংশোধন করে দাঁড়িয়ে আছি - যদি আপনি YYYYMMDD HH:MM:SS(২৪ ঘন্টার বিন্যাসে - বিশ্বের ফর্ম্যাটটি ব্যবহার করেন তবে আমেরিকা ছাড়া অন্য যে কেউ এটিকে ব্যবহার করে, কেবল সামরিক নয় ....) ড্যাশ ছাড়াই - এটি কাজ করে এমনকি Britishভাষার জন্যও । তবে আপনি যদি YYYY-MM-DD HH:MM:SSএটি ব্যবহার করেন তবে এটি ব্যর্থ হয় - সেই ক্ষেত্রে (ড্যাশগুলির সাথে), আপনাকে আক্ষরিক সাথে তারিখ এবং সময় আলাদা করতে হবেT
marc_s

1
@Shee কটাক্ষপাত SET DATEFORMATবিবৃতি । এটি পৃথক সংযোগের জন্য সেটিংস, তবে সেটিংসটি সার্ভার-ওয়াইড নির্দিষ্ট করা যেতে পারে। SET LANGUAGEর‌্যাডিক্সের জন্য কোন চরিত্রটি ব্যবহার করা হয় এবং এরকম কিছু নিয়ন্ত্রণ করতে আপনি নির্দিষ্ট করতে পারেন এবং তারিখের ফর্ম্যাটটি উত্তরাধিকার সূত্রে প্রাপ্ত হবে (আবার সার্ভার বা সংযোগের স্তরে)। এটি ঠিক যে ডিফল্টটি ইউএস ইংলিশ, এবং এমডি হ'ল মার্কিন ফর্ম্যাট। 4 বছরের তারিখ সহ ymd তবে সর্বদা কার্যকর হয়।
বেকন বিটস

29

স্ট্রিং লিটারেলের জন্য আরও একটি ভাষা-স্বতন্ত্র পছন্দ হ'ল আন্তর্জাতিক মানের আইএসও 8601 ফর্ম্যাট "YYYY-MM-DDThh মিমি: এসএস"। আমি ফর্ম্যাটটি পরীক্ষা করতে নীচের এসকিউএল কোয়েরিটি ব্যবহার করেছি এবং এটি সত্যই sys.syslanguages ​​এর সমস্ত এসকিউএল ভাষায় কাজ করে :

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

মাইক্রোসফ্ট টেকনেটের স্ট্রিং লিটারাল ডেট এবং টাইম ফর্ম্যাট বিভাগ অনুসারে , স্ট্যান্ডার্ড এএনএসআই স্ট্যান্ডার্ড এসকিউএল তারিখ ফর্ম্যাট "YYYY-MM-DD hh: mm: ss" "মাল্টি-ল্যাঙ্গুয়েজ" হওয়ার কথা। তবে, একই কোয়েরিটি ব্যবহার করে, সমস্ত এসকিউএল ভাষায় এএনএসআই ফর্ম্যাট কাজ করে না।

উদাহরণস্বরূপ, ডেনিশ ভাষায়, আপনি নিম্নলিখিতগুলির মতো অনেকগুলি ত্রুটি পাবেন:

ডেনিশ ভাষায় ত্রুটি ডেনিশ একটি তারিখের ডেটা টাইপটিতে একটি ভার্চার ডেটা ধরণের রূপান্তরকরণের ফলে সীমার মান ছাড়ানো হয়।

আপনি যদি এসকিউএল সার্ভারে চলার জন্য সি # তে একটি ক্যোয়ারী তৈরি করতে চান এবং আইএসও 8601 ফর্ম্যাটে আপনাকে একটি তারিখ পাস করতে হবে তবে বাছাইযোগ্য "গুলি" ফর্ম্যাট স্পেসিফায়ার ব্যবহার করুন :

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

মনে হয় আপনি YYYYMMDDকেবল তারিখের জন্য ব্যবহার করতে পারেন , এবং হয় YYYY-MM-DDThh:mm:ss(ড্যাশ সহ, এবং হ্যাঁ, Tতারিখ এবং সময় অংশের মধ্যে একটি !) বা YYYYMMDD HH:MM:SS(কোনও ড্যাশ নেই, কোনও
বিচ্ছেদী

1
@মার্ক_স: মন্তব্য করার জন্য আপনাকে ধন্যবাদ। আমি ISO 8601 ফর্ম্যাটটি উল্লেখ করার জন্য আমার উত্তর সম্পাদনা করেছি (এতে আপনি উল্লিখিত হিসাবে টি আক্ষরিক অন্তর্ভুক্ত রয়েছে)।
পল উইলিয়ামস

@ টেস্টল্যাং (ল্যাংডেট) মানগুলিতে .োকান ('2012-06-18T10: 34: 09') সেরা উত্তর।
মার্ট দোয়ান


8

আপনার এটির মতো যুক্ত করা দরকার

insert into table1(date1) values('12-mar-2013');

2

রূপান্তর ব্যবহার করার প্রয়োজন নেই। কেবল আইএসও 8601 ফর্ম্যাটে এটিকে উদ্ধৃত তারিখ হিসাবে তালিকাবদ্ধ করুন।
তাই ভালো:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

বিভাজকটি একটি /হওয়া দরকার এবং এটি একক 'উদ্ধৃতি দ্বারা বেষ্টিত হওয়া প্রয়োজন ।


1

আপনি যদি কোনও প্রোগ্রামিং ভাষার মাধ্যমে মানগুলি সঞ্চয় করে থাকেন

এখানে সি # তে একটি উদাহরণ দেওয়া হয়েছে

তারিখ সংরক্ষণ করার জন্য আপনাকে প্রথমে এটিকে রূপান্তর করতে হবে এবং তারপরে এটি সংরক্ষণ করতে হবে

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDate তারিখের সময় পরিবর্তনশীল যা আপনার ফর্ম্যাটে আপনার তারিখ ধারণ করে।


1

আমি আরও জেনেরিক সমস্যার মুখোমুখি হয়েছি: ডেটটাইম ফর্ম্যাটগুলি আলাদা (এবং প্রয়োজনীয়ভাবে জানা যায়নি) এবং ডেটটাইম কলামে এগুলি sertোকানো। আমি এই বিবৃতিটি ব্যবহার করে এটি সমাধান করেছি, যা অবশেষে একটি স্কেলারের ফাংশনে পরিণত হয়েছিল (ওডিবিসি ক্যানোনিকাল, আমেরিকান, এএনএসআই এবং ব্রিটিশ-ফ্রেঞ্চ তারিখ শৈলীর জন্য প্রাসঙ্গিক - প্রসারিত হতে পারে):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.