এসকিউএলাইটে 2 তারিখের মধ্যে পার্থক্য


110

এসকিউএলাইটে 2 তারিখের মধ্যে দিনের মধ্যে আমি কীভাবে পার্থক্য পেতে পারি? আমি ইতিমধ্যে এরকম কিছু চেষ্টা করেছি:

SELECT Date('now') - DateCreated FROM Payment

এটি প্রতিবার 0 ফেরত দেয়।

উত্তর:


123
 SELECT julianday('now') - julianday(DateCreated) FROM Payment;

10
নোট করুন যে ফাংশনটির নামটি কী ভাবতে পারে তা সত্ত্বেও, এটি দিনের চেয়ে বেশি গ্রানুলারিটি রয়েছে। এটি বেশ কয়েক দিন, তবে ভগ্নাংশ হতে পারে।
লিন্ডস

10
মনে রাখবেন যে জুলাইন্ডে মূল দিনগুলিতে দুপুর ইউটিসি থেকে - অর্থাত্ ২৪ ঘন্টা সময়কাল - অর্থাত্ ২৪ ঘন্টা সময়কালের (ভগ্নাংশ) প্রদান করে। গ্রিনউইচ থেকে 12 ঘন্টা পশ্চিমে আপনি যদি না চান তবে এটি সাধারণত আপনার প্রয়োজন হয় না। যেমন আপনি যদি লন্ডনে থাকেন তবে গতকাল বিকেলে একই জুলাইন্ডে এই সকালটি।
জুলিয়ানসাইমস

2
আপনার DateCreatedইউটিসিতে থাকলে এটি কাজ করে । পরিবর্তে যদি এটি স্থানীয় সময় হয় তবে julianday('now')আপনাকে স্থানীয় সময় রূপান্তর করতে হবে। এই তথ্য আছে এমন আমি কোথাও পাই না। আপনি যদি julianday('now') - julianday(DateCreated)এই পোস্টটি স্থানীয় সময়ে সঞ্চিত তারিখের সাথে পরামর্শ করেন তবে আপনার উত্তর GMT থেকে অফসেটে বন্ধ হয়ে যাবে এবং ভুল হবে। যদিও স্থানীয় সময়গুলিতে তারিখগুলি সংরক্ষণ করার পক্ষে সর্বোত্তম অনুশীলন না হলেও এটি এখনও এমন অ্যাপ্লিকেশনগুলিতে ঘটতে পারে যেখানে টাইমজোনগুলি কোনও ব্যাপার না (আপনি যখন যার সাথে কাজ করছেন সেই সরঞ্জামটি এখানকার মতো তাদের উপর চাপিয়ে দেয় তবে)।
vapcguy

3
এই অনুমানের সাথে ডেটক্রিটেড স্থানীয় সময় হয়, যদি আপনি julianday('now') - julianday(DateCreated, 'utc')উভয়কেই ইউটিসি করার জন্য এটি করেন তবে এটি একইভাবে কাজ করে না julianday('now', 'localtime') - julianday(DateCreated)। প্রাক্তনটি ডিএসটি দিনের জন্য অ্যাকাউন্ট করে না এবং মার্-নভেম্বর মাসে তৈরি তারিখগুলিতে অতিরিক্ত ঘন্টা যোগ করবে will পরেরটি আসলে এর জন্য অ্যাকাউন্ট করে। stackoverflow.com/questions/41007455/...
vapcguy

60

দিনগুলিতে পার্থক্য

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)

1
স্ক্লাইট সংস্করণ 3.12.0 এর জন্য কাস্ট এক্সপ্রেশনটির বন্ধনীগুলির মধ্যে যেমন TYPE রয়েছে। উদাহরণস্বরূপ "কাস্ট নির্বাচন করুন (5.6 পূর্ণসংখ্যা হিসাবে);" sqlite.org/lang_expr.html#castexpr অন্যথায় সত্যিই দরকারী উদাহরণ।
ছিনতাই

ধন্যবাদ @ আরব কেউ আমাকে এর আগে এডিট করার প্রস্তাব করেছিল। কিন্তু যখন আমি স্ক্লাইটব্রোজারে এটি চেষ্টা করেছি, এটি কাজ করছে না। পুরানো সংস্করণ হওয়ার কারণে এটি হতে পারে। তাই আমি এটি এটি যেমন রেখেছি ..
সায়কা

আমি কেবল এসকিউএলাইট ব্রাউজার ব্যবহার করেছি এবং ত্রুটিযুক্ত রবটির উল্লেখ পেয়েছি .. আমি কি আপনার পোস্টটিকে আধুনিক শব্দটিতে সম্পাদনা করতে পারি?
নুমেনন

@ নুমনন দয়া করে আপনার সম্পাদনার প্রস্তাব দিন। আমি এটি এখানে স্ক্লাইট ব্রাউজারে যাচাই করব এবং যদি এটি কাজ করে তবে অবশ্যই আপনার সম্পাদনা অনুমোদন করবে। সময় দেয়ার জন্য ধন্যবাদ.
সাইকা

2
এই উত্তরটি স্বীকৃত উত্তরের চেয়ে অনেক বেশি বৈশিষ্ট্যযুক্ত, আইএমএইচও।
মার্কাস পার্সনস

33

উভয় উত্তরই সমাধানগুলি আরও জটিল করে তোলে, যেমন তাদের হওয়া দরকার। বলুন পেমেন্টটি তৈরি হয়েছিল January 6, 2013। এবং আমরা এই তারিখ এবং আজকের মধ্যে পার্থক্য জানতে চাই।

sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557 

পার্থক্যটি 34 দিন। আমরা julianday('now')আরও ভাল স্বচ্ছতার জন্য ব্যবহার করতে পারি । অন্য কথায়, আমাদের কাজ করার জন্য পরামিতি হিসাবে ফাংশন লাগাতে date()বা প্রয়োজন হয় না ।datetime()julianday()


আমি নিশ্চিত নই, তবে যদি এই কমান্ডটি কোডে ছিল এবং 6 জানুয়ারির মান 2013 ডাটাবেস থেকে এসেছে, তবে ব্যবহৃত ডেটাটাইপটি বিবেচনা করা উচিত।
NoChance

23

এসকিউএল ডকুমেন্টেশন একটি দুর্দান্ত রেফারেন্স এবং ডেটএন্ডটাইমফানিউশন পৃষ্ঠা বুকমার্ক করার জন্য ভাল।

এটি স্মরণ করার জন্যও সহায়ক যে স্ক্লাইট কমান্ড লাইন ইউটিলিটি সহ কোয়েরিগুলির সাথে খেলা খুব সহজ:

sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55

1
যেহেতু এই পৃষ্ঠাটি একটি গুগল অনুসন্ধান ইঞ্জিন র‌্যাঙ্কিংয়ের সাথে আসে তাই এখানে বর্তমান লিঙ্কটি: sqlite.org/lang_datefunc.html
মার্কাস এন

9

এই উত্তরটি কিছুটা দীর্ঘায়িত, এবং ডকুমেন্টেশনগুলি আপনাকে এটি বলবে না (কারণ তারা ধরে নিচ্ছে যে আপনি আপনার তারিখগুলি ডাটাবেসে ইউটিসি তারিখ হিসাবে সংরক্ষণ করছেন), তবে এই প্রশ্নের উত্তর মূলত আপনার তারিখগুলি সংরক্ষণ করা টাইমজোনের উপর নির্ভর করে ইন। আপনি উভয় তারিখগুলি একটি সাধারণ তারিখের বিপরীতে গণনা করতে 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')

এগুলি উভয়ই ক্ষতিপূরণ হিসাবে দেখায় এবং ডিএসটি তারিখের জন্য অতিরিক্ত ঘন্টা যোগ করে না এবং সরাসরি বিয়োগ করে না - তাই কোনও ডিএসটি দিনে দুপুরে তৈরি হওয়া আইটেমটি, যখন কোনও ডিএসটি-র দিনে দুপুরে পরীক্ষা করা হয়, তখন অতিরিক্ত ঘন্টা পাবে না গণনা সম্পাদন।

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


"আপনি যদি আমাকে জিজ্ঞাসা করেন তবে এটি কেবল ছবির একটি অংশ এবং খুব সরল উত্তর" " হ্যাঁ তুমি সঠিক. তবে আমার উত্তরটি যখন তার প্রশ্ন জিজ্ঞাসা করার 3 মিনিটের পরে দেওয়া হয়েছিল যখন আপনার দুই বছর পরে আসে over সরলতাবাদী তবে তিনি তাঁর উপযুক্ত বলে মনে করলেন।
ফ্রেড

1
@ ফ্রেড ফেয়ার যথেষ্ট। তবে এটি আসলে আমাকে যাত্রায় নিয়ে গিয়ে শেষ হয়েছিল, যেমন আমি উপরে বর্ণনা করেছি এবং তাই আমাকে সাহায্য করেনি। আমি নিশ্চিত হতে চেয়েছিলাম যে ভবিষ্যতে এটি প্রত্যক্ষ করা কেউই ঠিক কী ঘটছে তা জানত তাই তারা আমার মতো একই ধরণের আঘাত হানতে পারেনি - বা যদি তারা করে থাকে তবে তারা কীভাবে তাদের থেকে বেরিয়ে আসতে পারে তা তারা জানত।
vapcguy

@ ফ্রেড, এটি খুব ভাল ব্যাখ্যা এবং আমি কী আশা করি তা নিশ্চিত নই? আপনার উত্তর পোস্ট হতে পারে?
NoChance

তোমার ব্যাখ্যার জন্য ধন্যবাদ. আমি নিশ্চিত নই যে এসকিউএলাইটের লোকেরা বছরের পর বছর ধরে যে মানদণ্ডকে গ্রহণ করতে বেড়েছে এবং তাদের অযথা জটিল বাস্তবায়ন হয়েছে এবং তারিখ এবং সময়ের মতো একটি গুরুত্বপূর্ণ দিক দিয়ে পরীক্ষা করা কঠিন, তার বিরুদ্ধে যাওয়ার সিদ্ধান্ত নিয়েছে! কল্পনা করুন যে অ্যাপ্লিকেশনটিতে প্রতিটি তারিখ যাচাই করতে প্রয়োজনীয় কতগুলি পরীক্ষাগুলি কাজ করে যা মানুষ এটি আশা করে!
NoChance

3

টাইম ক্লক ফাংশন লেখার জন্য একটি নোট। যারা কাজকর্মের জন্য ঘন্টার জন্য খুঁজছেন তাদের জন্য, এটির খুব সাধারণ পরিবর্তনগুলি বেশিরভাগ বেতনের সংস্থাগুলি চাইলে 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

ঝরঝরে সামান্য জিজ্ঞাসা, তবুও :)
vapcguy

3

আপনি যদি 00:00 ফর্ম্যাটে সময় চান তবে: আমি এটির মতো সমাধান করেছি:

select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something

2

আপনার তারিখের ফর্ম্যাটটি অনুসরণ করে: "YYYY-MM-DD HH: MM: SS", আপনার যদি মাসের সংখ্যায় দুটি তারিখের মধ্যে পার্থক্য খুঁজে পাওয়া দরকার:

(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))


2

প্রথমত, এটি আপনার তারিখের ফর্ম্যাটটি কী তা পরিষ্কার নয়। ইতিমধ্যে জড়িত একটি উত্তর আছে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



0

আমার ক্ষেত্রে, আমাকে কয়েক মিনিটের মধ্যে পার্থক্য গণনা করতে হবে এবং julianday()একটি সঠিক মান দেয় না। পরিবর্তে, আমি ব্যবহার strftime():

SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60

দুটি তারিখই ইউনিক্সটাইমে (সেকেন্ড) রূপান্তরিত হয়, তারপরে দুটি তারিখের মধ্যে সেকেন্ডে মান পেতে বিয়োগ করে। এরপরে, এটি 60 দ্বারা ভাগ করুন।

https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions

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