DateTime2 বনাম SQL সার্ভারে তারিখ সময়




sql-server tsql (10)

কোনটি:

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

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


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

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


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

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

Datetime এর .NET এর সংস্করণটি একই সময় এবং নির্ভুলতা Datetime রয়েছে। একটি পুরানো এসকিউএল Datetime সময় একটি .net Datetime ম্যাপিং যখন একটি অন্তর্নিহিত বৃত্তাকার ঘটে । পুরানো এসকিউএল DateTime 3 মিলিসেকেন্ডে সঠিক। এর মানে হল যে 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'

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


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


এখানে একটি উদাহরণ যা আপনাকে স্টোরেজ সাইজ (বাইট) এবং স্মলড্যাটটাইম, ডেটটাইম, ডেটটাইম ২ (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 টি বাইট সংরক্ষণ করতে পারি।


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

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

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

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

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

1.4। আরও নির্ভুলতা (100 ন্যানোসেকেন্ড উর্। 0.000,000,1 সেকেন্ড বনাম 3.33 মিলিসেকেন্ড উ 0.00 0.0033 সেকেন্ড।) (যদিও অতিরিক্ত স্পষ্টতাটি প্রাক্তন প্রকৌশল / বৈজ্ঞানিক অ্যাপ্লিকেশান ব্যতীত ব্যবহার করা হবে না)।

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

  1. কনস:

2.1। একটি .NET SqlCommand একটি পরামিতি পাস করার SqlCommand , আপনি SqlCommand নির্দিষ্ট করতে পারেন যদি আপনি SQL সার্ভার SqlCommand এবং / অথবা নির্ভুলতার বাইরে একটি মান পাস করতে পারেন, কারণ এটি System.Data.SqlDbType.DateTime ডিফল্ট System.Data.SqlDbType.DateTime

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

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

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

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

দ্রষ্টব্য: DateTime2 সময় 2টিকে সংখ্যার রূপে রূপান্তর করতে, আপনাকে নিচের সূত্রের মতো কিছু করতে হবে যা এখনও আপনার মানগুলি 1970 সালের চেয়ে কম নয় বলে মনে করে (যার অর্থ আপনি সমস্ত অতিরিক্ত পরিসীমা প্লাস অন্য 217 বছর হারাচ্ছেন। দ্রষ্টব্য: আপনি অতিরিক্ত পরিসরের জন্য অনুমতি দেওয়ার জন্য সূত্রটি কেবলমাত্র সামঞ্জস্য করতে সক্ষম হবেন না কারণ আপনি সংখ্যাসূচক ওভারফ্লো সমস্যাগুলি চালাতে পারেন।

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

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

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


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


datetime জন্য এমএসডিএন ডকুমেন্টেশন datetime ব্যবহার করে সুপারিশ। এখানে তাদের সুপারিশ:

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

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


DATEFORMAT - DATEFORMAT 2-এ তারিখের স্ট্রিংগুলির ব্যাখ্যাও ভিন্ন হতে পারে, যখন নন-মার্কিন DATEFORMAT সেটিংস ব্যবহার করে। যেমন

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

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

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

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


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

  1. মান বড় পরিসীমা
  2. ভাল সঠিকতা
  3. ছোট স্টোরেজ স্পেস (যদি ঐচ্ছিক ব্যবহারকারী-নির্দিষ্ট নির্ভুলতা নির্দিষ্ট করা হয়)

নিম্নলিখিত পয়েন্ট নোট করুন

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

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


Select ValidUntil + 1
from Documents

উপরের SQL একটি DateTime2 ক্ষেত্রের সাথে কাজ করবে না। এটি ফেরত এবং ত্রুটি "অপারেড টাইপ সংঘর্ষ: ডেটাটাইম 2 int এর সাথে অসঙ্গতিপূর্ণ"

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

"চলুন এই নতুন প্রকারটি ব্যবহার করি যা পুরাতন থেকে খারাপ", আমি তাই মনে করি না!






datetime2