এসকিউএলাইটে 2 তারিখের মধ্যে দিনের মধ্যে আমি কীভাবে পার্থক্য পেতে পারি? আমি ইতিমধ্যে এরকম কিছু চেষ্টা করেছি:
SELECT Date('now') - DateCreated FROM Payment
এটি প্রতিবার 0 ফেরত দেয়।
এসকিউএলাইটে 2 তারিখের মধ্যে দিনের মধ্যে আমি কীভাবে পার্থক্য পেতে পারি? আমি ইতিমধ্যে এরকম কিছু চেষ্টা করেছি:
SELECT Date('now') - DateCreated FROM Payment
এটি প্রতিবার 0 ফেরত দেয়।
উত্তর:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
ইউটিসিতে থাকলে এটি কাজ করে । পরিবর্তে যদি এটি স্থানীয় সময় হয় তবে julianday('now')
আপনাকে স্থানীয় সময় রূপান্তর করতে হবে। এই তথ্য আছে এমন আমি কোথাও পাই না। আপনি যদি julianday('now') - julianday(DateCreated)
এই পোস্টটি স্থানীয় সময়ে সঞ্চিত তারিখের সাথে পরামর্শ করেন তবে আপনার উত্তর GMT থেকে অফসেটে বন্ধ হয়ে যাবে এবং ভুল হবে। যদিও স্থানীয় সময়গুলিতে তারিখগুলি সংরক্ষণ করার পক্ষে সর্বোত্তম অনুশীলন না হলেও এটি এখনও এমন অ্যাপ্লিকেশনগুলিতে ঘটতে পারে যেখানে টাইমজোনগুলি কোনও ব্যাপার না (আপনি যখন যার সাথে কাজ করছেন সেই সরঞ্জামটি এখানকার মতো তাদের উপর চাপিয়ে দেয় তবে)।
julianday('now') - julianday(DateCreated, 'utc')
উভয়কেই ইউটিসি করার জন্য এটি করেন তবে এটি একইভাবে কাজ করে না julianday('now', 'localtime') - julianday(DateCreated)
। প্রাক্তনটি ডিএসটি দিনের জন্য অ্যাকাউন্ট করে না এবং মার্-নভেম্বর মাসে তৈরি তারিখগুলিতে অতিরিক্ত ঘন্টা যোগ করবে will পরেরটি আসলে এর জন্য অ্যাকাউন্ট করে। stackoverflow.com/questions/41007455/...
দিনগুলিতে পার্থক্য
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
ঘন্টা পার্থক্য
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
মিনিট মধ্যে পার্থক্য
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
সেকেন্ডে পার্থক্য
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
উভয় উত্তরই সমাধানগুলি আরও জটিল করে তোলে, যেমন তাদের হওয়া দরকার। বলুন পেমেন্টটি তৈরি হয়েছিল January 6, 2013
। এবং আমরা এই তারিখ এবং আজকের মধ্যে পার্থক্য জানতে চাই।
sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557
পার্থক্যটি 34 দিন। আমরা julianday('now')
আরও ভাল স্বচ্ছতার জন্য ব্যবহার করতে পারি । অন্য কথায়, আমাদের কাজ করার জন্য পরামিতি হিসাবে ফাংশন লাগাতে date()
বা প্রয়োজন হয় না
।datetime()
julianday()
এসকিউএল ডকুমেন্টেশন একটি দুর্দান্ত রেফারেন্স এবং ডেটএন্ডটাইমফানিউশন পৃষ্ঠা বুকমার্ক করার জন্য ভাল।
এটি স্মরণ করার জন্যও সহায়ক যে স্ক্লাইট কমান্ড লাইন ইউটিলিটি সহ কোয়েরিগুলির সাথে খেলা খুব সহজ:
sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
এই উত্তরটি কিছুটা দীর্ঘায়িত, এবং ডকুমেন্টেশনগুলি আপনাকে এটি বলবে না (কারণ তারা ধরে নিচ্ছে যে আপনি আপনার তারিখগুলি ডাটাবেসে ইউটিসি তারিখ হিসাবে সংরক্ষণ করছেন), তবে এই প্রশ্নের উত্তর মূলত আপনার তারিখগুলি সংরক্ষণ করা টাইমজোনের উপর নির্ভর করে ইন। আপনি উভয় তারিখগুলি একটি সাধারণ তারিখের বিপরীতে গণনা করতে Date('now')
ব্যবহার করেন না , তবে julianday()
ফাংশনটি ব্যবহার করুন , তারপরে একে অপরের থেকে ফলাফলের পার্থক্যটি বিয়োগ করুন।
যদি আপনার তারিখগুলি ইউটিসিতে সঞ্চিত থাকে:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
শীর্ষস্থানীয় উত্তরটি এটাই, এবং ডকুমেন্টেশনেও রয়েছে । আপনি যদি আমাকে জিজ্ঞাসা করেন তবে এটি কেবল ছবির অংশ এবং খুব সরল উত্তর।
যদি আপনার তারিখগুলি স্থানীয় সময়ে সঞ্চিত থাকে তবে উপরের কোডটি ব্যবহার করে আপনার উত্তরটি আপনার GMT অফসেটের ঘন্টা কতটুকু ভুল হয়ে যাবে। আপনি যদি আমার মতো পূর্ব আমেরিকায় থাকেন, যা GMT -5, আপনার ফলাফলটি এতে 5 ঘন্টা যুক্ত হবে। এবং আপনি যদি DateCreated
ইউটিসির সাথে সামঞ্জস্য করার চেষ্টা করেন কারণ julianday('now')
একটি GMT তারিখের বিপরীতে:
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
এটিতে একটি বাগ রয়েছে যেখানে এটি DateCreated
দিবালোক সঞ্চয় সময় (মার্চ-নভেম্বর) এর সময়কালের জন্য এক ঘন্টা যোগ করবে । বলুন যে "এখন" একটি নন-ডিএসটি দিবসে দুপুরে এবং আপনি জুনে (ডিএসটি চলাকালীন) দুপুরে কিছু তৈরি করেছিলেন, আপনার ফলাফলটি ঘন্টা অংশের জন্য 0 ঘন্টা পরিবর্তে 1 ঘন্টা আলাদা দেবে। আপনাকে আপনার অ্যাপ্লিকেশনটির কোডে এমন একটি ফাংশন লিখতে হবে যা ফলাফলটি পরিবর্তন করতে এবং ফলাফলটি সংশোধন করতে এবং ডিএসটি তারিখ থেকে এক ঘন্টা বিয়োগ করতে পারে the আমি তা করেছি, যতক্ষণ না আমি বুঝতে পারি যে আমার যে সমস্যাটি ছিল তার আরও ভাল সমাধান আছে: এসকিউএলাইট বনাম ওরাকল - তারিখের পার্থক্যের গণনা - ঘন্টা
পরিবর্তে, যেভাবে আমার দিকে ইঙ্গিত করা হয়েছিল, স্থানীয় সময়ে সঞ্চিত তারিখগুলির জন্য, উভয়ই স্থানীয় সময়ের সাথে মেলে:
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
বা 'Z'
স্থানীয় সময় সংযোজন :
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
এগুলি উভয়ই ক্ষতিপূরণ হিসাবে দেখায় এবং ডিএসটি তারিখের জন্য অতিরিক্ত ঘন্টা যোগ করে না এবং সরাসরি বিয়োগ করে না - তাই কোনও ডিএসটি দিনে দুপুরে তৈরি হওয়া আইটেমটি, যখন কোনও ডিএসটি-র দিনে দুপুরে পরীক্ষা করা হয়, তখন অতিরিক্ত ঘন্টা পাবে না গণনা সম্পাদন।
এবং আমি যখন স্বীকৃত হয়েছি তখন বলব যে আপনার ডাটাবেসে স্থানীয় সময়ে তারিখগুলি সংরক্ষণ করবেন না এবং ইউটিসি-তে সংরক্ষণ করুন যাতে আপনি এটির মধ্যে না চলে, প্রতিটি অ্যাপ্লিকেশনটির বিশ্বব্যাপী শ্রোতা নেই এবং প্রতিটি প্রোগ্রামার চান না তাদের সিস্টেমে প্রতিটি তারিখের রূপান্তরটি ইউটিসি-তে রূপান্তরিত করতে এবং প্রতিবার যখনই তারা ডাটাবেসে জিইটি বা এসইটি করেন এবং কিছু স্থানীয় বা ইউটিসি-তে থাকে তা নির্ধারণের জন্য ডিল করতে পারেন।
টাইম ক্লক ফাংশন লেখার জন্য একটি নোট। যারা কাজকর্মের জন্য ঘন্টার জন্য খুঁজছেন তাদের জন্য, এটির খুব সাধারণ পরিবর্তনগুলি বেশিরভাগ বেতনের সংস্থাগুলি চাইলে plus০ শতাংশ হিসাবে এই মুহুর্তগুলি দেখায় plus
CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked
Clock In Clock Out HoursWorked
2016-08-07 11:56 2016-08-07 18:46 6.83333332836628
আপনি যদি 00:00 ফর্ম্যাটে সময় চান তবে: আমি এটির মতো সমাধান করেছি:
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
প্রথমত, এটি আপনার তারিখের ফর্ম্যাটটি কী তা পরিষ্কার নয়। ইতিমধ্যে জড়িত একটি উত্তর আছেstrftime("%s")
।
আমি এই উত্তরটি প্রসারিত করতে চাই।
এসকিউএলাইটের কেবলমাত্র নিম্নোক্ত স্টোরেজ ক্লাস রয়েছে: নুল, সূচক, বাস্তব, পাঠ্য বা ব্লক। জিনিসগুলিকে সরল করার জন্য, আমি ধরে নেব যে তারিখগুলি সত্যই 1970 এর সেকেন্ডগুলি রয়েছে 1970-01-01 থেকে। এখানে একটি নমুনা স্কিমা দেওয়া হয়েছে যার জন্য আমি "1 লা ডিসেম্বর 2018" এর নমুনা ডেটা রাখব:
CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));
এবার আসুন "1 লা ডিসেম্বর 2018" এবং এখনকার মধ্যে তারিখের পার্থক্যটি কার্যকর করা যাক (যেমন আমি এটি লিখছি, এটি 12 ই ডিসেম্বর 2018 মধ্যাহ্ন):
দিনগুলিতে তারিখের পার্থক্য:
SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
ঘন্টা সময় পার্থক্য:
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
মিনিটের মধ্যে তারিখের পার্থক্য:
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
সেকেন্ডে তারিখের পার্থক্য:
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
আপনি যদি সেকেন্ডের মধ্যে পার্থক্য চান
SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')
আপনি যদি দিনের মধ্যে রেকর্ড চান,
select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
আমার ক্ষেত্রে, আমাকে কয়েক মিনিটের মধ্যে পার্থক্য গণনা করতে হবে এবং julianday()
একটি সঠিক মান দেয় না। পরিবর্তে, আমি ব্যবহার strftime()
:
SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60
দুটি তারিখই ইউনিক্সটাইমে (সেকেন্ড) রূপান্তরিত হয়, তারপরে দুটি তারিখের মধ্যে সেকেন্ডে মান পেতে বিয়োগ করে। এরপরে, এটি 60 দ্বারা ভাগ করুন।