এসকিউএল সার্ভারে ডেটটাইম 2-তে কীভাবে তারিখ এবং সময় একত্রিত করবেন?


48

নিম্নলিখিত উপাদান দেওয়া

DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'

DATETIME2(7)মান সহ ফলাফল তৈরি করতে তাদের একত্রিত করার সর্বোত্তম উপায় কী '2013-10-13 23:59:59.9999999'?

কিছু জিনিস যা কাজ করে না তা নীচে তালিকাভুক্ত করা হয়েছে।


SELECT @D + @T 

অপেরাড ডেটা টাইপের তারিখ অ্যাড অপারেটরের জন্য অবৈধ।


SELECT CAST(@D AS DATETIME2(7)) + @T 

অপেরাড ডেটা টাইপ ডেটটাইম 2 অ্যাড অপারেটরের জন্য অবৈধ।


SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)

তারিখের ফাংশনটির ফলে একটি ওভারফ্লো হয়েছিল। দুটি তারিখ / সময় উদাহরণ পৃথক করে ডেটপার্টগুলির সংখ্যা খুব বেশি। কম সুনির্দিষ্ট ডেট পার্ট সহ ডেটেফ ব্যবহার করার চেষ্টা করুন।

* অ্যাজুর এসকিউএল ডেটাবেস এবং এসকিউএল সার্ভার 2016 ব্যবহার করে ওভারফ্লো এড়ানো যায় DATEDIFF_BIG


SELECT CAST(@D AS DATETIME) + @T 

ডেটা টাইপ ডেটটাইম এবং সময় অ্যাড অপারেটরের সাথে বেমানান।


SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)

ফলাফল দেয় তবে নির্ভুলতা হারায় 2013-10-13 23:59:59.997

উত্তর:


49

এটি কাজ করে এবং যথার্থতা ঠিক রাখে বলে মনে হয়:

SELECT DATEADD(day, DATEDIFF(day,'19000101',@D), CAST(@T AS DATETIME2(7)))

CASTথেকে DATETIME2(7)পরিবর্তন করে TIME(7)মান ( @Tএকটি) এর DATETIME2যেখানে তারিখ অংশ '1900-01-01', যা তারিখ এবং DATETIME ধরনের ডিফল্ট মান হল (দেখুন datetime2এবং মন্তব্য *CASTএবংCONVERT পৃষ্ঠা দুটিই MSDN এ।)

* ... যখন কেবলমাত্র তারিখ বা কেবল সময়ের উপাদানগুলিকে প্রতিনিধিত্ব করে এমন চরিত্রের ডেটা টাইম বা ছোট সময়সীমার ডেটা টাইপ করা হয়, অনির্দিষ্ট সময় উপাদানটি 00: 00: 00.000 সেট করা হয় এবং অনির্ধারিত তারিখের উপাদানটি 1900-01- এ সেট করা হয়- 01

DATEADD()এবং DATEDIFF()বাকি ফাংশন নিতে যত্ন, অর্থাত মধ্যে দিনের পার্থক্য যোগ করার 1900-01-01এবং DATEমান ( @D)।

পরীক্ষায়: এসকিউএল-ফিডল


@ কোয়ান্ডারির মত লক্ষ্য করা যায় যে উপরের এক্সপ্রেশনটি এসকিউএল সার্ভার দ্বারা নন-ডিটার্মনিস্টিক হিসাবে বিবেচিত হয়। আমরা যদি একটি নির্বিচারবাদী ভাব চাই, বলুন কারণ এটি একটি PERSISTEDকলামের জন্য ব্যবহার করা উচিত , '19000101'** দ্বারা প্রতিস্থাপন করা প্রয়োজন 0বা CONVERT(DATE, '19000101', 112):

CREATE TABLE date_time
( d DATE NOT NULL,
  t TIME(7) NOT NULL,
  dt AS DATEADD(day, 
                DATEDIFF(day, CONVERT(DATE, '19000101', 112), d), 
                CAST(t AS DATETIME2(7))
               ) PERSISTED
) ;

**: DATEDIFF(day, '19000101', d)যেমন স্ট্রিং একজন অন্তর্নিহিত রূপান্তর করে সেটি নিয়ামক নয় DATETIMEএবং স্ট্রিং থেকে DATETIME থেকে ধর্মান্তর হয় নির্ণায়ক শুধুমাত্র যখন নির্দিষ্ট শৈলী ব্যবহার করা হয়।


8

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

DECLARE @D DATE = SYSUTCDATETIME()
, @T TIME = SYSUTCDATETIME();

SELECT DATEADD(DAY, DATEDIFF(DAY, @T, @D), CONVERT(DATETIME2, @T));

নীতিটি হ'ল সময় মানকে ডেটটাইম 2 এবং তারপরে তারিখে রূপান্তর করে, সময়টি আলাদা করে দেয় এবং ডিফল্ট তারিখ নির্ধারণ করে, তারপরে আপনি দিনগুলি যুক্ত করার জন্য আপনার তারিখের মানটি দিয়ে তারিখ দিয়ে যান, আপনার সময়কে ডেটটাইম 2 তে কাস্ট করেন এবং যুক্ত করুন দিন পরে।


"DATEDIFF (DAY, @T, @D)" এর পরিবর্তে এটি "DATEDIFF (DAY, 0, @D)" হওয়া উচিত। ফলাফলটি একই, তবে বিভ্রান্তি এড়াতে সহায়তা করে। ডেটডিফ (দিন, ...) আর্গুমেন্টকে সর্বনিম্ন দিনের সংখ্যায় কাস্ট করে, তাই @ টি যাইহোক 0 তে রূপান্তরিত হয়।
ডেনিস গোরালিক

5

এসকিউএল সার্ভারের জন্য 2012 এবং তারপরে DATETIME2FROMPARTS ফাংশন রয়েছে। এটির এই ফর্মটি রয়েছে:

DATETIME2FROMPARTS(year, month, day, hour, minute, seconds, fractions, precision)

প্রদত্ত নমুনা ডেটার জন্য এটি হয়ে যায়

select Answer = DATETIME2FROMPARTS(2013, 10, 13, 23, 59, 59, 9999999, 7);

ফলাফল যা

Answer
---------------------------
2013-10-13 23:59:59.9999999

অস্থায়ী ডেটাটাইপগুলি থেকে শুরু করে, বা প্রশ্নের নমুনা মানগুলি তৈরি করতে ব্যবহৃত টেক্সট থেকে অংশগুলি DATEPART () ব্যবহার করে প্রাপ্ত করা যেতে পারে ।


0

এটি আপনার প্রথম উদাহরণটিকে কাজ করতে না দেওয়ার জন্য এটি এসকিউএল সার্ভারের বেশ বোকা এবং এটি সত্যিই বোবা মনে হচ্ছে, তবে…

select convert(datetime2, convert(nvarchar(max), @d) + ' ' + convert(nvarchar(max), @t));

0
SELECT mydate=CAST(CAST(@D AS nvarchar(max)) + ' ' + 
                   CAST(@T AS nvarchar (max)) 
              AS DATETIME2);

5
আপনি কি এটি পরীক্ষা করেছেন? এটা কি কাজ করে? এটি ভাষা সেটিংস দ্বারা প্রভাবিত হয়?
ypercubeᵀᴹ

0

আমি এখানে নামার সময় আমি অন্য কিছু খুঁজছিলাম। প্রশ্নটি বেশ পুরানো, তবে সাম্প্রতিক কিছু মন্তব্য এবং ক্রিয়াকলাপ রয়েছে। ভেবেছিলাম আমি একটি সহজ পদ্ধতি ভাগ করেছি যা @ আটারিওর জবাবের সাথে খুব মিল, তবে কিছুটা ছোট এবং কিছু পড়তে সহজ হতে পারে:

declare @d date = '2013-10-13'
declare @t time(7) = '23:59:59.9999999'

select cast(concat(@d, ' ', @t) as datetime2(7))

-3

আপনি কাটটি কাটতে DATE থেকে কেটে কাটাতে পারবেন, তারপরে DATETIME এ ফিরে TIME যোগ করতে পারেন

select CAST( cast(getdate() as date) as DATETIME)  + CAST(getdate() as TIME)

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