একক কলামে ডেটা সংরক্ষণ করা পছন্দের উপায়, যেহেতু তারা অবিচ্ছেদ্যভাবে সংযুক্ত রয়েছে। সময়ের একটি বিন্দু হ'ল তথ্য নয়, দুটি নয়।
অনেক পণ্য দ্বারা "পর্দার পিছনে" নিয়োগের তারিখ / সময় তথ্য সংরক্ষণের একটি সাধারণ উপায় হ'ল এটি একটি দশমিক মানকে রূপান্তর করা যেখানে "তারিখ" দশমিক মানের পূর্ণসংখ্যার অংশ এবং "সময়" হয় ভগ্নাংশ মান। সুতরাং, 1900-01-01 00:00:00 0.0 এবং সেপ্টেম্বর 20, 2016 9:34:00 হিসাবে 42631.39861 হিসাবে সংরক্ষণ করা হয়। 42001 1900-01-01 থেকে দিনের সংখ্যা। .39861 মধ্যরাত থেকে কেটে যাওয়া সময়ের অংশ। এটি করতে সরাসরি দশমিক প্রকার ব্যবহার করবেন না, একটি সুস্পষ্ট তারিখ / সময় প্রকার ব্যবহার করুন; আমার বক্তব্য এখানে একটি উদাহরণ মাত্র।
দুটি পৃথক কলামে ডেটা সংরক্ষণ করার অর্থ আপনি যে কোনও সময় স্তরের বিন্দু সঞ্চিত মানের চেয়ে আগে বা পরে আগে দেখতে চান তা দেখতে উভয় কলামের মান একত্রিত করতে হবে।
আপনি যদি মানগুলি আলাদাভাবে সঞ্চয় করেন তবে আপনি অনায়াসে "বাগগুলি" এ চালাবেন যা সনাক্ত করা কঠিন। উদাহরণস্বরূপ নিন:
IF OBJECT_ID('tempdb..#DT') IS NOT NULL
DROP TABLE #DT;
CREATE TABLE #DT
(
dt_value DATETIME NOT NULL
, d_value DATE NOT NULL
, t_value TIME(0) NOT NULL
);
DECLARE @d DATETIME = '2016-09-20 09:34:00';
INSERT INTO #DT (dt_value, d_value, t_value)
SELECT @d, CONVERT(DATE, @d), CONVERT(TIME(0), @d);
SET @d = '2016-09-20 11:34:00';
INSERT INTO #DT (dt_value, d_value, t_value)
SELECT @d, CONVERT(DATE, @d), CONVERT(TIME(0), @d);
/* show all rows with a date after 2016-07-01 11:00 am */
SELECT *
FROM #DT dt
WHERE dt.dt_value >= '2016-07-01 11:00:00';
/* show all rows with a date after 2016-07-01 11:00 am */
SELECT *
FROM #DT dt
WHERE dt.d_value >= CONVERT(DATE, '2016-07-01')
AND dt.t_value >= CONVERT(TIME(0), '11:00:00');
উপরের কোডে, আমরা একটি পরীক্ষার টেবিল তৈরি করছি, এটি দুটি মান দিয়ে পপুলেশন করছি, তারপরে সেই তথ্যটির বিরুদ্ধে একটি সাধারণ ক্যোয়ারী করছি। প্রথমটি SELECT
উভয় সারি প্রদান করে, তবে দ্বিতীয়টি SELECT
কেবল একটি একক সারি দেয়, যা পছন্দসই ফলাফল নাও হতে পারে:
একটি তারিখ / সময় পরিসীমা ফিল্টার করার সঠিক উপায় যেখানে মানগুলি পৃথক কলামে রয়েছে, যেমন মন্তব্যগুলিতে @ সাইপারকিউব দ্বারা নির্দেশিত হয়েছে:
WHERE dt.d_value > CONVERT(DATE, '2016-07-01') /* note there is no time component here */
OR (
dt.d_value = CONVERT(DATE, '2016-07-01')
AND dt.t_value >= CONVERT(TIME(0), '11:00:00')
)
আপনার যদি বিশ্লেষণের উদ্দেশ্যে পৃথক সময়ের উপাদান প্রয়োজন হয় তবে আপনি মানটির সময় অংশের জন্য গণনা করা, অবিরত, কলাম যুক্ত করতে বিবেচনা করতে পারেন:
ALTER TABLE #DT
ADD dt_value_time AS CONVERT(TIME(0), dt_value) PERSISTED;
SELECT *
FROM #dt;
অবিরাম কলামটি দিনের বেলা অনুসারে দ্রুত প্রকারের ইত্যাদির জন্য অনুমতি দিয়ে সূচিযুক্ত করা যেতে পারে।
যদি আপনি প্রদর্শনের লক্ষ্যে তারিখ এবং সময়কে দুটি ক্ষেত্রের মধ্যে বিভক্ত করার কথা ভাবছেন, আপনার বুঝতে হবে যে ফর্ম্যাটিংটি ক্লায়েন্টে করা উচিত, সার্ভার নয়।