এসকিউএল সার্ভারে ডেটটাইম 2 বনাম ডেটটাইম


762

কোনটি:

হয় SQL সার্ভার 2008+ সঞ্চয় তারিখ এবং সময় করার প্রস্তাবিত উপায়?

আমি নির্ভুলতার মধ্যে পার্থক্য সম্পর্কে সচেতন (এবং সম্ভবত স্টোরেজ স্পেস), তবে আপাতত এগুলি উপেক্ষা করে কোনটি ব্যবহার করা যায় সে সম্পর্কে একটি সর্বোত্তম অনুশীলন দলিল আছে, অথবা আমাদের কেবলমাত্র ব্যবহার করা উচিত datetime2?

উত্তর:


641

জন্য MSDN ডকুমেন্টেশন DATETIME ব্যবহার বিশেষ পরামর্শ দেওয়া হচ্ছে datetime2 । তাদের সুপারিশটি এখানে:

ব্যবহার করুন time, date, datetime2এবং datetimeoffsetনতুন কাজ জন্য তথ্য ধরনের। এই ধরণেরগুলি এসকিউএল স্ট্যান্ডার্ডের সাথে প্রান্তিক হয়। তারা আরও বহনযোগ্য। time, datetime2এবং datetimeoffset আরও সেকেন্ডের যথার্থতা সরবরাহ করে। datetimeoffsetবিশ্বব্যাপী মোতায়েন অ্যাপ্লিকেশনগুলির জন্য সময় অঞ্চল সমর্থন সরবরাহ করে।

ডেটটাইম 2 এর আরও বড় তারিখের পরিধি, একটি বৃহত্তর ডিফল্ট ভগ্নাংশ যথাযথতা এবং userচ্ছিক ব্যবহারকারী-নির্দিষ্ট নির্ভুলতা রয়েছে। এছাড়াও ব্যবহারকারী-নির্দিষ্ট নির্ভুলতার উপর নির্ভর করে এটি কম সঞ্চয়স্থান ব্যবহার করতে পারে।


46
ডেটটাইম 2 সহ যথাযথতা বৃদ্ধি পেলে কিছু ক্লায়েন্ট তারিখ, সময় বা তারিখ 2 সমর্থন করে না এবং আপনাকে স্ট্রিং আক্ষরিক রূপান্তর করতে বাধ্য করে। আপনি যদি নির্ভুলতার চেয়ে সামঞ্জস্যতা নিয়ে বেশি উদ্বিগ্ন হন তবে
ডেটটাইম

4
আর একটি বিকল্প হ'ল সামঞ্জস্যের জন্য ডেটটাইম হিসাবে রূপান্তরিত কলামের সাথে একটি সূচী দর্শন ব্যবহার করা। তবে আপনাকে অ্যাপটি ভিউতে নির্দেশ করতে সক্ষম হতে হবে।
তমুসজেরোয়েস

9
DATETIMEOFFSET এর সাথে টাইম জোন সমর্থনটি একটি মিসনোমার। এটি কেবলমাত্র নির্দিষ্ট সময়ের জন্য কোনও ইউটিসি অফসেট সংরক্ষণ করে, সময় অঞ্চল নয়।
সানক্যাট 2000

5
@ পোড়ড: "এসকিউএল স্ট্যান্ডার্ড" হওয়ার কারণে "" আরও বেশি পোর্টেবল "হওয়ার অনুশীলনে ঠিক কী লাভ? এটি আপনাকে অন্য একটি আরডিবিএমএসে" পোর্ট "এর জন্য উল্লেখযোগ্যভাবে কম পঠনযোগ্য / রক্ষণাবেক্ষণযোগ্য উল্লেখযোগ্যভাবে আরও কোড লিখতে বাধ্য করার পাশাপাশি এটি যে এই কোডটির জীবনের জন্য কখনই না ঘটতে পারে Microsoft সম্ভবত মাইক্রোসফ্ট সরবরাহিত এসকিউএল সার্ভার সরঞ্জাম এবং ড্রাইভারগুলি (এমনকি থাকলেও) ছাড়াও এমন কোনও অ্যাপস রয়েছে যা প্রকৃতপক্ষে DateTime2(বা অন্য কোনও এসকিউএল সার্ভারের নির্দিষ্ট বিট-স্তরের উপস্থাপনা নির্ভর করে) যে বিষয়টি জন্য টাইপ করুন) কেন আমি জিজ্ঞেস করছি জন্য নীচের আমার 7/10/17 উত্তর কনস দেখুন?।
টম

2
@ অ্যাডাম পোড়াদ: এছাড়াও, এই সমস্ত সুবিধা সম্ভবত অপ্রয়োজনীয় (ইঞ্জিনিয়ারিং বা বৈজ্ঞানিক অ্যাপ্লিকেশনগুলির বাইরে) এবং অতএব সুবিধাগুলি হ্রাসের পক্ষে মূল্যহীন নয়, অনেক বেশি প্রয়োজন সম্ভবত: আরও সহজ (এমনকি কাজের ক্ষেত্র বিবেচনা করে) স্পষ্টত / স্পষ্টত রূপান্তরিত করার ক্ষমতা সংযোজন, বিয়োগফল, সর্বনিম্ন, সর্বাধিক এবং গড়ের জন্য একটি ভাসমান পয়েন্ট সংখ্যাসূচক (যদি # অ্যাপ্লিকেশন, যদি কমপক্ষে তারিখের সময় থেকে ভগ্নাংশের দিনগুলি অন্তর্ভুক্ত থাকে) বিস্তারিত জানার জন্য নীচে আমার 7/10/17 উত্তরটিতে কনস দেখুন।
টম

493

DATETIME2" DATETIME991/01/01 " এর মাধ্যমে " 991/01/01 " এর একটি তারিখের পরিসীমা রয়েছে যখন প্রকারটি কেবল 1753-9999 বছর সমর্থন করে।

এছাড়াও, আপনার যদি প্রয়োজন হয় তবে DATETIME2সময়ের সাথে আরও সুনির্দিষ্ট হতে পারে; DATETIME 3/3 মিলিসেকেন্ডে সীমাবদ্ধ, যখন DATETIME2100ns পর্যন্ত নিখুঁত হতে পারে।

System.DateTimeনেট থেকে ম্যাপ উভয় প্রকারের - কোনও পার্থক্য নেই।

আপনার যদি পছন্দ হয় তবে আমি DATETIME2যখনই সম্ভব ব্যবহার করার পরামর্শ দেব । আমি DATETIME(পিছনে সামঞ্জস্যতা ব্যতীত) কোনও উপকারিতা দেখছি না - আপনার কম সমস্যা হবে (তারিখগুলি সীমার বাইরে চলে আসার সাথে সাথে ঝামেলা)।

এছাড়াও: আপনার যদি কেবল তারিখের প্রয়োজন হয় (সময় ব্যতীত), তারিখটি ব্যবহার করুন - এটি ঠিক ততটাই দুর্দান্ত DATETIME2এবং আপনাকে স্থানও বাঁচায়! :-) একই সময়ের জন্য শুধুমাত্র - ব্যবহার TIME। এই ধরণের জন্য এখানে কি!


157
স্কেলকম্যান্ডে প্যারামিটার হিসাবে .NET ডেটটাইম মান যুক্ত করার সময় সতর্কতা অবলম্বন করুন কারণ এটি এটি পুরানো ডেটটাইম টাইপ বলে ধরে নিতে পছন্দ করে এবং আপনি যদি 1753-9999 বছরের সীমার বাইরে ডেটটাইম মান লেখার চেষ্টা করেন তবে আপনি একটি ত্রুটি পাবেন you'll আপনি স্কেলপ্যারামিটারের জন্য স্পষ্টভাবে System.Data.SqlDbType.DateTime2 হিসাবে প্রকারটি নির্দিষ্ট না করে থাকেন। যাইহোক, ডেটটাইম 2 দুর্দান্ত, কারণ এটি .NET ডেটটাইম টাইপের মধ্যে সংরক্ষণ করা যায় এমন কোনও মান সঞ্চয় করতে পারে।
ট্রায়ঙ্কো

10
@মার্ক_স - এটি কি নাল জন্য নয়?
জনএফএক্স

8
@ জনএফএক্স - এখানে কিছুটা দেরি - তবে আপনি কোনও ডেটটাইম স্থির করবেন না। আপনি নুলযোগ্য <ডেটটাইম> বা ডেটটাইম ব্যবহার করবেন? যা নাল ঠিক জরিমানা পরিচালনা করে - এবং কোনও প্রোকে ম্যাপিংয়ে কেবল পরম করতে পারে val মূল্য = কিছু তারিখটাইম ?? DBValue. নাল এটি দুর্ভাগ্যজনক যে আমরা এর পরে একটি সংখ্যার সাথে একটি ডেটাটাইপ দিয়ে
আটকেছি -

69
লল, আমি আমার নিজের মন্তব্যটি (উপরে) ঠিক করার চেষ্টা করেছি, আমি বুঝতে পারার আগে এটি আমার নিজের মন্তব্য (এক বছর আগে করা হয়েছিল)। আমি এখনও NET ফ্রেমওয়ার্কের ডাবল ডিজাইনের সিদ্ধান্তের সাথে ডিফল্টরূপে সমস্ত ডেটটাইম মানগুলিকে ট্রান্সক্রিট করার সিদ্ধান্ত নিয়ে যাচ্ছি যখন স্কেলপ্যারামিটার হিসাবে স্বীকৃত হয় যদি না আপনি স্পষ্টভাবে এটি আরও সুনির্দিষ্ট SqlDbType.DateTime2 এ সেট না করেন। সঠিকভাবে স্বয়ংক্রিয়ভাবে অনুমান করার জন্য অনেক কিছু। সত্যই, তাদের পরিবর্তনের স্বচ্ছতা তৈরি করা উচিত ছিল, কম সুনির্দিষ্ট, কম দক্ষ, সীমিত-পরিসরের বাস্তবায়ন প্রতিস্থাপন করে এবং মূল "ডেটটাইম" টাইপের নামটি রেখে দেওয়া উচিত। আরও দেখুন stackoverflow.com/q/8421332/88409
Triynko

5
@marc_s কি এর Nullable<DateTime>জন্য নয়?
ক্রিসডাব্লু

207

ডেটটাইম 2 বেশিরভাগ ক্ষেত্রে জয়ী হয় (পুরানো অ্যাপ্লিকেশনগুলির সামঞ্জস্যতা)

  1. মান বৃহত্তর পরিসীমা
  2. আরও ভাল নির্ভুলতা
  3. ছোট স্টোরেজ স্পেস (userচ্ছিক ব্যবহারকারী-নির্দিষ্ট নির্ভুলতা নির্দিষ্ট করা থাকলে)

এসকিউএল তারিখ এবং সময় ডেটা টাইপ তুলনা - তারিখ সময়, তারিখ 2, তারিখ, সময়

নিম্নলিখিত বিষয়গুলি নোট করুন

  • বাক্য গঠন
    • ডেটটাইম 2 [(ভগ্নাংশের সেকেন্ড যথার্থতা => স্টোরেজের আকারের নীচে দেখুন)]
  • যথার্থতা, স্কেল
    • 100ns এর নির্ভুলতার সাথে 0 থেকে 7 ডিজিট।
    • ডিফল্ট নির্ভুলতা 7 অঙ্ক।
  • স্টোরেজ আকার
    • 3 এর চেয়ে কম নির্ভুলতার জন্য 6 বাইট;
    • স্পষ্টতা 3 এবং 4 জন্য 7 বাইট।
    • অন্যান্য সমস্ত নির্ভুলতার জন্য 8 বাইট প্রয়োজন
  • ডেটটাইম 2 (3) এর ডেটটাইম হিসাবে একই সংখ্যার সংখ্যা রয়েছে তবে 8 বাইটের পরিবর্তে 7 বাইট স্টোরেজ ব্যবহার করে ( এসকিউএলএইচএনটিস-ডেটটাইম বনাম ডেটটাইম 2 )
  • ডেটটাইম 2 এ আরও সন্ধান করুন (লেনদেন-এসকিউএল এমএসডিএন নিবন্ধ)

চিত্রের উত্স: এমসিটিএস স্ব-গতিযুক্ত প্রশিক্ষণ কিট (পরীক্ষা 70-432): মাইক্রোসফ্ট এসকিউএল সার্ভার ® 2008 - বাস্তবায়ন এবং রক্ষণাবেক্ষণ অধ্যায় 3: টেবিল -> পাঠ 1: সারণী তৈরি করা -> পৃষ্ঠা 66


7
এটির জন্য পরিসংখ্যান +1 দেখানোর জন্য ধন্যবাদ, datetime2দুর্দান্ত (বিজয়ী)
পঙ্কজ পার্কার

2
@ ইমান আবিদী: ওসকার বার্গগ্রেনের মন্তব্য অনুযায়ী 10 ই সেপ্টেম্বর, ২০১৪ সন্ধ্যা 3:৫১ এ "এসকিউএল হিন্টস-ডেটটাইম বনাম ডেটটাইম 2" আপনি উল্লেখ করেছেন: "ডেটটাইম 2 (3) ডেটটাইমের মতো নয় as তাদের একই সংখ্যা থাকবে অঙ্কের, তবে ডেটটাইমের যথার্থতা 3.33ms এবং ডেটটাইম 2 (3) এর নির্ভুলতা 1 মিমি ""
টম

1
@ পঙ্কজপ্রিকার: ওহো, এত তাড়াতাড়ি নয়। আপনি নীচে আমার d/১০/১ated তারিখের উত্তরটির কনস বিভাগটি দেখতে চাইতে পারেন।
টম

বৃহত্তর পরিসীমা এবং উচ্চতর নির্ভুলতার datetime2তুলনায় কীভাবে কম সঞ্চয় স্থান ব্যবহার করে datetime?
দাই

106

আমি @মার্ক_স এবং @ অ্যাডাম_পওয়ার্ডের সাথে সম্মতি জানাই - ডেটটাইম 2 হ'ল এগিয়ে যাওয়ার পছন্দসই পদ্ধতি। এটিতে তারিখের বিস্তৃত পরিসর, উচ্চতর নির্ভুলতা রয়েছে এবং সমান বা কম সঞ্চয়স্থান ব্যবহৃত হয় (নির্ভুলতার উপর নির্ভর করে)।

একটা জিনিষ আলোচনা মিস তবে ...
@Marc_s বলে: Both types map to System.DateTime in .NET - no difference there। এটি সঠিক, তবে বিপরীতটি সত্য নয় ... এবং তারিখের সীমা অনুসন্ধান করার সময় এটি গুরুত্বপূর্ণ (যেমন "5/5/2010 এ সমস্ত রেকর্ড আমাকে সন্ধান করুন")।

.NET এর সংস্করণটির Datetimeসাথে একই পরিসীমা এবং যথার্থতা রয়েছে DateTime2Datetimeপুরানো এসকিউএল এ। নেট ম্যাপ করার সময় DateTimeএকটি অন্তর্নিহিত বৃত্তাকার ঘটে । পুরানো এসকিউএল DateTime3 মিলিসেকেন্ডে সঠিক। এর অর্থ এটি যে 11:59:59.997আপনি দিনের শেষে যেতে পারবেন তত কাছাকাছি। উচ্চতর যে কোনও কিছুই পরের দিন পর্যন্ত গোল হয়।

এটা চেষ্টা কর :

declare @d1 datetime   = '5/5/2010 23:59:59.999'
declare @d2 datetime2  = '5/5/2010 23:59:59.999'
declare @d3 datetime   = '5/5/2010 23:59:59.997'
select @d1 as 'IAmMay6BecauseOfRounding', @d2 'May5', @d3 'StillMay5Because2msEarlier'

ডেটটাইম 2 এ যাওয়ার জন্য এই অন্তর্নিহিত রাউন্ডিং এড়ানো একটি উল্লেখযোগ্য কারণ। খেজুরের স্পষ্ট বৃত্তাকার স্পষ্ট বিভ্রান্তির কারণ:


13
যাইহোক কোনও দিনের "শেষ" সন্ধান করার চেষ্টা না করে আপনি এই বৃত্তাকারটিকে এড়াতে পারেন। > = ৫ মে এবং <মে much আরও নিরাপদ এবং তারিখ / সময় ধরণের যে কোনওটিতে (অবশ্যই সময় TIME ব্যতীত) কাজ করবে। মি / ডি / ইয়াইয়ের মতো আঞ্চলিক, অস্পষ্ট ফর্ম্যাটগুলি এড়িয়ে যাওয়ার পরামর্শ দিন।
অ্যারন বারট্রান্ড

2
@ অ্যারনবার্ট্র্যান্ড - সম্পূর্ণরূপে একমত, তবে আমাদের কাছে যে সংখ্যাটি প্রশ্ন রয়েছে তা বর্ণনা করা উপযুক্ত বলে মনে হচ্ছে।
EBarr

1
আপনি কেন থেকে স্যুইচ 20100505করলেন 5/5/2010? পূর্ববর্তী ফর্ম্যাটটি এসকিউএল সার্ভারের যে কোনও অঞ্চলের সাথে কাজ করবে। দ্বিতীয়টি ভাঙ্গবে: SET LANGUAGE French; SELECT Convert(datetime, '1/7/2015')2015-07-01 00:00:00.000
ওফস

1
@ ইবার: রি। "ডেটটাইম 2 অগ্রসর হওয়া পছন্দসই পদ্ধতি It এটির তারিখগুলির বিস্তৃত পরিসর, উচ্চতর নির্ভুলতা রয়েছে এবং সমান বা কম স্টোরেজ ব্যবহার করা হয় (যথাযথতার উপর নির্ভর করে": আমি দৃ disag়ভাবে একমত নই। নীচের of/১০/১ated তারিখের আমার উত্তরের কনস বিভাগটি দেখুন সংক্ষেপে, এই সুবিধাগুলি সম্ভবত অবিশ্রুত (ইঞ্জিনিয়ারিং / বৈজ্ঞানিক অ্যাপ্লিকেশনগুলির বাইরের) এবং অতএব সুবিধাগুলি হ্রাসের পক্ষে আরও বেশি সম্ভাবনা থাকা দরকার না, স্পষ্টভাবে / সুস্পষ্টভাবে একটি ভাসমান-পয়েন্ট সংখ্যায় রূপান্তরিত করার ক্ষমতা আরও সহজ (এমনকি কাজের ক্ষেত্র বিবেচনা করে) # দিনের সাথে অন্তর্ভুক্ত। যদি অ্যাপ্লিকেশন, মিনিটের তারিখ-সময় থেকে ভগ্নাংশ) +, - এবং গড়ের জন্য মান
টম

20

প্রায় সমস্ত উত্তর এবং মন্তব্যগুলি পেশাদারদের পক্ষে ভারী হয়েছে এবং কনসকে আলোকপাত করেছে। এখানে এখন পর্যন্ত সমস্ত পেশাদার এবং কনস এর একটি পুনরুদ্ধার প্লাস কিছু গুরুত্বপূর্ণ কনস (নীচে # 2 এ) আমি কেবল একবার উল্লেখ করেছি বা মোটেও নয় উল্লেখ করেছি।

  1. পেশাদাররা:

1.1। আরও আইএসএস অনুগত (আইএসও 8601) (যদিও বাস্তবে এটি কীভাবে কার্যকর হয় তা আমি জানি না)।

1.2। অধিকতর পরিসীমা (1/1/0001 থেকে 12/31/9999 বনাম 1/1 / 1753-12 / 31/9999) (যদিও অতিরিক্ত পরিসীমা, 1753 সালের পূর্বে, প্রাক্তন ব্যতীত সম্ভবত ব্যবহৃত হবে না, historicalতিহাসিক, জ্যোতির্বিদ্যা সংক্রান্ত, ভূতাত্ত্বিক ইত্যাদি অ্যাপ্লিকেশনগুলিতে)।

1.3। নির্ভুলভাবে .NET এর DateTimeপ্রকারের ব্যাপ্তির পরিসরের সাথে মেলে (যদিও মানগুলি লক্ষ্য প্রকারের সীমার মধ্যে থাকে এবং যথাযথ # 2 এর নীচে নির্ভুলতার সাথে অন্য কোনও কোডিং না দিয়ে পিছনে পিছনে রূপান্তরিত হয় অন্যথায় ত্রুটি / রাউন্ডিং ঘটবে)।

1.4। আরও নির্ভুলতা (100 ন্যানোসেকেন্ড ওরফে 0.000,000,1 সেকেন্ড। বনাম 3.33 মিলিসেকেন্ড ওরফে 0.003,33 সেকেন্ড।) (যদিও প্রকৃতির প্রকৌশল / বৈজ্ঞানিক অ্যাপ্লিকেশনগুলিতে অতিরিক্ত নির্ভুলতা সম্ভবত ব্যবহার করা হবে না।)

1.5। যখন অনুরূপ (যেমন 1 মিলিসেক হিসাবে "একই" নয় (যেমন 3.33 মিলিসেক হিসাবে) ইমান আবিদি দাবি করেছেন) যথাযথতা হিসাবে DateTimeকম স্থান (7 বনাম 8 বাইট) ব্যবহার করে, তবে অবশ্যই আপনি হেরে যাবেন নির্ভুলতা বেনিফিট যা সম্ভবত দু'জনের মধ্যে একটি (অন্যটি হ'ল পরিসীমা) সম্ভবত সবচেয়ে অপ্রয়োজনীয় সুবিধাগুলি থাকলেও) ted

  1. কনস:

2.1। .NET এ প্যারামিটারটি পাস করার সময় SqlCommand, আপনাকে অবশ্যই উল্লেখ করতে হবে System.Data.SqlDbType.DateTime2যে আপনি এসকিউএল সার্ভারের DateTimeব্যাপ্তি এবং / অথবা নির্ভুলতার বাইরে কোনও মান পার করছেন , কারণ এটি ডিফল্ট হয় System.Data.SqlDbType.DateTime

2.2। সংখ্যাসূচক মান এবং অপারেটরগুলি ব্যবহার করে এসকিউএল সার্ভার এক্সপ্রেশনগুলিতে নিম্নলিখিতটি / সাথে এটি করার জন্য ভাসমান-পয়েন্ট সংখ্যায় (মিনিটের তারিখের পর থেকে # দিনের) মান রূপান্তরিত / সহজে রূপান্তরিত করা যায় না:

2.2.1। # দিন বা আংশিক দিন যোগ করুন বা বিয়োগ করুন। দ্রষ্টব্য: DateAddকাজের সময় হিসাবে ফাংশনটি ব্যবহার করা তুচ্ছ নয় যখন আপনাকে তারিখ-সময়ের সমস্ত অংশ না হলে একাধিক বিবেচনা করতে হবে।

2.2.2। "বয়স" গণনার উদ্দেশ্যে দুটি তারিখ-সময়ের মধ্যে পার্থক্য নিন। দ্রষ্টব্য: আপনি কেবল DateDiffপরিবর্তে এসকিউএল সার্ভারের ফাংশনটি ব্যবহার করতে পারবেন না , কারণ এটি গণনা করে না কারণ ageবেশিরভাগ লোকেরা আশা করে যে যদি দুটি তারিখের সময়গুলি নির্দিষ্ট ইউনিটের একটি ক্যালেন্ডার / ঘড়ির তারিখের সময়সীমা অতিক্রম করে, এমনকি যদি ক্ষুদ্র ভগ্নাংশের জন্যও হয় যে ইউনিট, এটা পার্থক্য হল যে ইউনিট 1 বনাম 0. উদাহরণস্বরূপ ফিরে আসবেন, DateDiffDayদুই তারিখ-সময়ের গুলি মাত্র 1 মিলিসেকেন্ডে পৃথক্ 1 বনাম 0 (দিন) ফিরে আসবে যদি ঐ তারিখ-বার বিভিন্ন ক্যালেন্ডারের দিনগুলিতে (যেমন "1999-12-31 23: 59: 59.9999999" এবং "2000-01-01 00: 00: 00.0000000")। একই 1 মিলিসেকেন্ড পার্থক্য তারিখের সময়গুলি যদি সরানো হয় যাতে তারা কোনও ক্যালেন্ডার দিন অতিক্রম না করে Day, 0 (দিন) এর মধ্যে একটি "ডেটডিফ" ফিরিয়ে দেবে ।

2.2.3। নিতে Avgকেবল ফিরে আবার "ফ্লোট" রূপান্তর প্রথম এবং তারপর তারিখ-বার (একটি সমষ্টিগত ক্যোয়ারীতে) এর DateTime

দ্রষ্টব্য: DateTime2একটি সংখ্যায় রূপান্তর করতে, আপনাকে নিম্নলিখিত সূত্রের মতো কিছু করতে হবে যা এখনও ধরে নেয় যে আপনার মানগুলি ১৯ year০ সালের চেয়ে কম নয় (যার অর্থ আপনি অতিরিক্ত পরিসরের চেয়ে আরও ২১7 বছর হারাচ্ছেন Note দ্রষ্টব্য: আপনি অতিরিক্ত পরিসরের অনুমতি দেওয়ার জন্য সূত্রটি কেবলমাত্র সামঞ্জস্য করতে সক্ষম হবেন না কারণ আপনি সংখ্যার ওভারফ্লো সমস্যা নিয়ে চলে যেতে পারেন।

25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0- উত্স: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "

অবশ্যই, আপনি এছাড়াও পারা Castথেকে DateTimeপ্রথম (এবং প্রয়োজনে ফিরে আবার করতে DateTime2), কিন্তু আপনি স্পষ্টতা এবং পরিসীমা (সারা বছর পূর্বে 1753) সুবিধাগুলো হারান চাই DateTime2বনাম DateTimeযা prolly 2 সবচেয়ে বড় এবং একই সময়ে prolly হয় সংক্ষিপ্ত / সম্ভবত "সংযোজন /" বয়স "(বনাম DateDiff) / Avgক্যালকস সুবিধার জন্য ভাসমান-পয়েন্ট সংখ্যাতে (# দিনের) অবধি / সহজ রূপান্তরগুলি হারাতে গেলে কেন এটি ব্যবহার করবেন এমন প্রশ্নটি কমপক্ষে 2 টি সম্ভবত প্রয়োজন যা একটি বড় আমার অভিজ্ঞতা.

বিটিডব্লিউ, Avgতারিখের সময়গুলি (বা কমপক্ষে হওয়া উচিত) একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে। ক) তারিখ-সময়গুলি (একটি সাধারণ ভিত্তির তারিখ-সময়) সময়কাল (একটি সাধারণ অনুশীলন) উপস্থাপনের জন্য ব্যবহৃত হয় তখন গড় সময়কাল পাওয়ার ক্ষেত্রে ব্যবহার ছাড়াও, খ) গড় তারিখের ড্যাশবোর্ড-জাতীয় পরিসংখ্যান প্রাপ্ত করার জন্যও এটি দরকারী সময়টি সারিগুলির একটি ব্যাপ্তি / গোষ্ঠীর তারিখ-সময় কলামে। গ) একটি কলামের মানগুলি পর্যবেক্ষণ / সমস্যা সমাধানের জন্য একটি মান (বা কমপক্ষে স্ট্যান্ডার্ড হওয়া উচিত ) অ্যাড-হক কোয়েরি যা বৈধ / যেহেতু আর বৈধ হতে পারে না এবং / অথবা অবমূল্যায়নের প্রয়োজন হতে পারে প্রতিটি মানের জন্য উপস্থিতি গণনা তালিকাভুক্ত করা এবং (যদি উপলভ্য থাকে) Min, Avgএবং Maxসেই মানের সাথে সম্পর্কিত তারিখ-সময় স্ট্যাম্পগুলি।


1
কনট্রিয়েন ভিউয়ের মতো - এটি সমীকরণের গ # দিকটি দেখায়। অন্যান্য সমস্ত "পেশাদার "গুলির সাথে একত্রিত হয়ে এটি লোকেরা যেখানে তাদের ব্যথা নিতে চায় তার উপর ভিত্তি করে একটি ভাল পছন্দ করার সুযোগ দেয়।
EBarr

1
@ ইবার: আমার "" বিপরীতে দৃষ্টিভঙ্গির "# 1 অংশটিই সমীকরণের গ # দিকটি দেখায়"। বাকী (কনস # এর ২.২.১ - ২.২.৩), যা আমি বলেছিলাম যে অনেক বেশি সম্ভাব্য বেনিফিট (এর DateTime), সেগুলি এসকিউএল সার্ভারের অনুসন্ধান এবং বিবৃতিগুলির সাথে প্রভাব সম্পর্কিত।
টম

২.২.১ পুনরায় - তারিখগুলিতে পাটিগণিত করা এটি একটি অনিরাপদ অনুশীলন হিসাবে বিবেচিত হয় এবং পছন্দসই উপায় সর্বদা ডেটএড এবং সম্পর্কিত ফাংশন ব্যবহার করা। এটি সেরা অনুশীলন। তারিখ গাণিতিক করার গুরুতর দায়বদ্ধতা রয়েছে, এর মধ্যে সবচেয়ে কমপক্ষে এটি বেশিরভাগ তারিখের জন্য কাজ করে না। কয়েকটি নিবন্ধ: sqlservercentral.com/blogs/… sqlblog.org/2011/09/20/…
আরবারমান

@ আরবারম্যান: পুনরায় "অনিরাপদ": এটি নির্দিষ্ট তারিখের ধরণের সাথে কেবল অনিরাপদ (যেমন DateTime2আমি ইতিমধ্যে উল্লেখ করেছি (ওভারফ্লো হওয়ার উচ্চ সম্ভাবনার কারণে))। করছেন। "বেশিরভাগ তারিখের ধরণের জন্য কাজ করে না": আপনার কেবল এটির সাথে কাজ করার দরকার রয়েছে এবং বেশিরভাগ অ্যাপ্লিকেশনে বেশিরভাগ তারিখগুলি সম্ভবত তাদের পুরো জীবনের সময়গুলির জন্য অন্য কোনও তারিখের ধরণে রূপান্তর করতে হবে না (সম্ভবত আমি যেমন উল্লেখ করেছি) , DateTime2থেকে DateTime(যেমন "তারিখগুলি উপর গাণিতিক" করতে; p) প্রদত্ত যে, এটা সব অতিরিক্ত শুধুমাত্র প্রোগ্রাম করা কিন্তু অ্যাড-হক গবেষণা প্রশ্নের একটি অ-গাণিতিক বন্ধুত্বপূর্ণ তারিখ টাইপ ব্যবহার করার জন্য কোডিং মূল্য
টম

15

আপনি যদি কোনও অ্যাক্সেস বিকাশকারী হয়ে প্রশ্নে ক্ষেত্রটিতে এখন () লিখতে চাইছেন তবে ডেটটাইম 2 হ'ল বিপর্যয় ডেকে আনে। সবেমাত্র একটি অ্যাক্সেস করেছেন -> এসকিউএল 2008 আর 2 স্থানান্তর এবং এটি ডেটটাইম 2 হিসাবে সমস্ত ডেটটাইম ক্ষেত্রগুলি রেখেছিল। মানটি বোমা ফেলার সাথে সাথে এখন () এর সাথে একটি রেকর্ড যুক্ত করা হচ্ছে। এটি 1/1/2012 2:53:04 অপরাহ্নে ঠিক ছিল, কিন্তু 1/10/2012 2:53:04 অপরাহ্নে নয়।

চরিত্র একবার পার্থক্য তৈরি। আশা করি এটি কারও সাহায্য করবে।


15

এখানে একটি উদাহরণ যা আপনাকে স্টোরেজ আকারের (বাইট) পার্থক্য এবং ছোট তারিখের সময়, তারিখের সময়, তারিখের সময় 2 (0) এবং তারিখ 2 (7) এর মধ্যে নির্ভুলতা প্রদর্শন করবে:

DECLARE @temp TABLE (
    sdt smalldatetime,
    dt datetime,
    dt20 datetime2(0),
    dt27 datetime2(7)
)

INSERT @temp
SELECT getdate(),getdate(),getdate(),getdate()

SELECT sdt,DATALENGTH(sdt) as sdt_bytes,
    dt,DATALENGTH(dt) as dt_bytes,
    dt20,DATALENGTH(dt20) as dt20_bytes,
    dt27, DATALENGTH(dt27) as dt27_bytes FROM @temp

যা ফিরে আসে

sdt                  sdt_bytes  dt                       dt_bytes  dt20                 dt20_bytes  dt27                         dt27_bytes
2015-09-11 11:26:00  4          2015-09-11 11:25:42.417  8         2015-09-11 11:25:42  6           2015-09-11 11:25:42.4170000  8

সুতরাং আমি যদি দ্বিতীয়টিতে তথ্য সংরক্ষণ করতে চাই - তবে মিলিসেকেন্ডে নয় - আমি ডেটটাইম বা ডেটটাইম 2 (7) এর পরিবর্তে ডেটটাইম 2 (0) ব্যবহার করি তবে আমি প্রতি 2 টি বাইট সংরক্ষণ করতে পারি।


10

যখন বেড়ে যায় স্পষ্টতা সঙ্গে datetime2 , কিছু ক্লায়েন্ট সমর্থন করে না তারিখ , সময় , বা datetime2 এবং একটি স্ট্রিং আক্ষরিক রূপান্তর বাধ্য। বিশেষত মাইক্রোসফ্ট এই ডেটা প্রকারগুলির সাথে "ডাউন লেভেল" ওডিবিসি, ওএলই ডিবি, জেডিবিসি এবং স্কেলক্লিয়েন্ট বিষয়গুলির উল্লেখ করেছে এবং একটি চার্ট রয়েছে প্রত্যেকটি কীভাবে মানচিত্রটি প্রদর্শন করতে পারে ।

যদি নির্ভুলতার তুলনায় মানের সামঞ্জস্যতা থাকে তবে ডেটটাইম ব্যবহার করুন


10

পুরানো প্রশ্ন ... তবে আমি এমন কিছু যুক্ত করতে চাই যা ইতিমধ্যে এখানে কারও দ্বারা বলা হয়নি ... (দ্রষ্টব্য: এটি আমার নিজস্ব পর্যবেক্ষণ, সুতরাং কোনও রেফারেন্স জিজ্ঞাসা করবেন না)

ফিল্টার মানদণ্ডে ব্যবহার করার সময় তারিখ 2 2 দ্রুত হয়।

TLDR:

এসকিউএল ২০১ In সালে আমার এক সহস্র সারি এবং একটি ডেটটাইম কলাম ENTRY_TIME সহ একটি টেবিল ছিল কারণ এটি সেকেন্ড পর্যন্ত সঠিক সময় সঞ্চয় করার প্রয়োজন ছিল। অনেকগুলি যোগদান এবং একটি সাব কোয়েরি সহ একটি জটিল কোয়েরি কার্যকর করার সময়, আমি যখন যেখানে ক্লজটি ব্যবহার করেছি:

WHERE ENTRY_TIME >= '2017-01-01 00:00:00' AND ENTRY_TIME < '2018-01-01 00:00:00'

শত শত সারি থাকাকালীন প্রাথমিকভাবে ক্যোয়ারী ঠিক ছিল, কিন্তু যখন সারিগুলির সংখ্যা বৃদ্ধি পেয়েছিল তখন কোয়েরিটি এই ত্রুটিটি দেওয়া শুরু করেছিল:

Execution Timeout Expired. The timeout period elapsed prior
to completion of the operation or the server is not responding.

আমি যেখানে ক্লজটি সরিয়েছি এবং অপ্রত্যাশিতভাবে, 1 সেকেন্ডে ক্যোরিটি চালানো হয়েছিল, যদিও এখন সমস্ত তারিখের জন্য সমস্ত সারি আনা হয়েছিল। আমি যেখানে ক্লজটি দিয়ে অভ্যন্তরীণ কোয়েরিটি চালিত করেছি এবং এটি 85 সেকেন্ড নিয়েছিল, এবং যেখানে ক্লজ ছাড়াই এটি 0.01 সেকেন্ড নিয়েছিল।

ডেটটাইম ফিল্টারিং কর্মক্ষমতা হিসাবে আমি এই ইস্যুটির জন্য এখানে অনেকগুলি থ্রেড জুড়ে এসেছি

আমি জিজ্ঞাসাটি কিছুটা অপ্টিমাইজ করেছি। তবে আসল গতিটি আমার কাছে ছিল ডেটটাইম কলামটি ডেটটাইম 2 তে পরিবর্তন করে।

পূর্বে সময় শেষ হওয়া একই ক্যোয়ারীটি একটি সেকেন্ডের চেয়ে কম সময় নেয়।

চিয়ার্স


9

মধ্যে তারিখ স্ট্রিং ব্যাখ্যা datetimeএবং datetime2যখন নন-ইউএস ব্যবহার খুব বিভিন্ন হতে পারে, DATEFORMATসেটিংস। যেমন

set dateformat dmy
declare @d datetime, @d2 datetime2
select @d = '2013-06-05', @d2 = '2013-06-05'
select @d, @d2

এই আয় 2013-05-06(অর্থাত 6 মে) জন্য datetime, এবং 2013-06-05জন্য (অর্থাত 5 জুন) datetime2। যাইহোক, dateformatসেট সঙ্গে mdy, উভয় @dএবং @d2ফিরে 2013-06-05

datetimeআচরণ সঙ্গে মতভেদ বলে মনে হয় MSDN ডকুমেন্টেশন এর SET DATEFORMATযেটি বলে: কিছু অক্ষর স্ট্রিং ফরম্যাটের, উদাহরণস্বরূপ আইএসও 8601 জন্য, DATEFORMAT সেটিংয়ের স্বাধীনভাবে ব্যাখ্যা করা হয় । অবশ্যই সত্য নয়!

যতক্ষণ না আমাকে এটুকু কামড়ায়, আমি সর্বদা ভাবতাম যে yyyy-mm-ddভাষা / স্থানীয় সেটিংস নির্বিশেষে তারিখগুলি ঠিকই পরিচালনা করা হবে।


2
নাঃ। আইএসও 8601 এর জন্য আমি মনে করি আপনি YYYYMMDD (কোনও ড্যাশ নেই) বোঝাতে চেয়েছিলেন। SET LANGUAGE FRENCH; DECLARE @d DATETIME = '20130605'; SELECT @d;ড্যাশগুলি দিয়ে আবার চেষ্টা করুন।
অ্যারন বারট্রান্ড

1
স্ট্যান্ডার্ডটি YYYY-MM-DD এবং YYYYMMDD ফর্ম্যাট উভয়ের জন্য ক্যালেন্ডারের তারিখের উপস্থাপনের জন্য অনুমতি দেয়। আমি মনে করি যে আইএসও 8601 নির্দিষ্টকরণের সাবসেটটি স্বতন্ত্রভাবে ব্যাখ্যা করা উচিত সম্পর্কে এমএসডিএন আরও সুনির্দিষ্ট হওয়া উচিত!
রিচার্ড ফাউসেট

1
আমি জানি যে তবে এসকিউএল সার্ভারে কেবল নো-ড্যাশ সিনট্যাক্সই নিরাপদ।
অ্যারন বারট্রান্ড

6

এই নিবন্ধ অনুসারে , আপনি যদি ডেটটাইম 2 ব্যবহার করে ডেটটাইমের একই সূক্ষ্মতা দেখতে চান তবে আপনাকে কেবল ডেটটাইম 2 (3) ব্যবহার করতে হবে। এটি আপনাকে একই সূক্ষ্মতা দেবে, একটি কম বাইট গ্রহণ করবে এবং প্রসারিত ব্যাপ্তি সরবরাহ করবে।


পরিষ্কার হয়ে উঠতে, এটি এসকিউএল ডেটটাইমের মতো একই নির্ভুলতা, কোনও নেট ডেটটাইম নয়।
স্যাম রুয়েবি

এটি সঠিক, আমি ধরে নিয়েছি প্রত্যেকে প্রসঙ্গটি বুঝতে পারে তবে এটির জন্য বিশেষভাবে উল্লেখ করা দরকার।
jKlaus

4

আমি কেবল আরও একটি সুবিধার জন্য হোঁচট DATETIME2খেয়েছি: এটি পাইথন adodbapiমডিউলে একটি বাগ এড়িয়ে চলে , যা একটি স্ট্যান্ডার্ড লাইব্রেরির datetimeমান পাস করা হয় যদি একটি DATETIMEকলামের জন্য শূন্য-মাইক্রোসেকেন্ড রয়েছে তবে কলামটি হিসাবে সংজ্ঞায়িত করা থাকলে তা সূক্ষ্মভাবে কাজ করে DATETIME2


0
Select ValidUntil + 1
from Documents

উপরের এসকিউএল ডেটটাইম 2 ক্ষেত্রের সাথে কাজ করবে না। এটি ফিরে আসে এবং ত্রুটি হয় "অপেরাড ধরণের সংঘর্ষ: ডেটটাইম 2 ইন্টের সাথে বেমানান"

পরের দিনটি পেতে 1 যুক্ত করা বিকাশকারীরা বছরের পর বছর ধরে তারিখগুলি দিয়ে যাচ্ছেন। এখন মাইক্রোসফ্টের একটি দুর্দান্ত নতুন ডেটটাইম 2 ক্ষেত্র রয়েছে যা এই সাধারণ কার্যকারিতাটি পরিচালনা করতে পারে না।

"আসুন এই নতুন ধরণটি ব্যবহার করুন যা পুরানোটির চেয়ে খারাপ", আমার মনে হয় না!


2
শুধু তাই এখানে এসেছি স্পষ্ট datetimeএবং datetime2ধরনের তথ্য উভয় SQL সার্ভার 2008 সালে চালু হয় এছাড়াও আপনি পেতে Operand type clash: date is incompatible with intথেকে dateটাইপ কোন দিন ডট যেহেতু হয়েছে প্রায়। তিনটি ডেটা ধরণের dateadd(dd, 1, ...)যদিও ঠিক সাথে কাজ করে ।
সর্বদা

2
এটি পরিষ্কার নয়। আমার একটি এসকিউএল সার্ভার 2005 ডাটাবেস এতে একটি ডেটটাইম ক্ষেত্র আছে।
পল ম্যাকার্থি

0

আমি মনে করি DATETIME2স্টোরটি সঞ্চয় করার সর্বোত্তম উপায় date, কারণ এটির চেয়ে বেশি দক্ষতা রয়েছে DATETIME। ইন SQL Server 2008আপনি ব্যবহার করতে পারেন DATETIME2, এটি একটি তারিখ ও সময় সঞ্চয় করে, 6-8 লাগে bytesসঞ্চয় করতে এবং এর একটি গ্রুপ আছে 100 nanoseconds। সুতরাং যে কারও বেশি সময়ের নির্ভুলতা প্রয়োজন তিনি চাইবেন DATETIME2

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