মাইএসকিউএল ডেটটাইম ক্ষেত্র এবং দিবালোক সঞ্চয় সময় - "অতিরিক্ত" ঘন্টা আমি কীভাবে উল্লেখ করব?


89

আমি আমেরিকা / নিউইয়র্ক টাইমজোন ব্যবহার করছি। ফলশ্রুতিতে আমরা একটি ঘন্টা "পিছিয়ে পড়ে" - কার্যকরভাবে 2 টা বেজে এক ঘন্টা "অর্জন" করি। ট্রানজিশন পয়েন্টে নিম্নলিখিতটি ঘটে:

এটি 01:59:00 -04: 00
তারপরে 1 মিনিট পরে এটি হয়:
01:00:00 -05: 00

সুতরাং আপনি যদি "1:30:30" খালি বলে থাকেন তবে আপনি প্রথমে 1:30 ঘূর্ণায়মান বা দ্বিতীয় বারের কথা উল্লেখ করছেন কিনা তা এ সম্পর্কে অস্পষ্ট। আমি একটি মাইএসকিউএল ডাটাবেসে সময় নির্ধারণের ডেটা সংরক্ষণ করার চেষ্টা করছি এবং সময়গুলি কীভাবে সঠিকভাবে সংরক্ষণ করা যায় তা নির্ধারণ করতে পারি না।

এখানে সমস্যাটি রয়েছে:
"2009-11-01 00:30:00" হিসাবে
অভ্যন্তরীণভাবে সংরক্ষণ করা হয় ২০০৯-০১-০১ 00:30:00 -04: 00 "2009-11-01 01:30:00" হিসাবে অভ্যন্তরীণভাবে সংরক্ষণ করা হয় 2009-11-01 01:30:00 -05: 00

এটি সূক্ষ্ম এবং মোটামুটি প্রত্যাশিত। তবে আমি কীভাবে 01:30:00 -04: 00 এ কিছু সংরক্ষণ করব ? ডকুমেন্টেশন উল্লেখ অফসেট এবং সেই অনুযায়ী যখন আমি উল্লেখ অফসেট এটা যথাযথভাবে উপেক্ষিত হয়েছে চেষ্টা করেছি কোনো সমর্থন প্রদর্শন করে না।

কেবলমাত্র সমাধানগুলির মধ্যেই আমি সার্ভারকে এমন সময় নির্ধারণের সাথে জড়িত করে যা দিবালোকের সঞ্চয় সময় ব্যবহার করে না এবং আমার স্ক্রিপ্টগুলিতে প্রয়োজনীয় রূপান্তরগুলি ব্যবহার করে না (আমি এর জন্য পিএইচপি ব্যবহার করছি) involve তবে এটি প্রয়োজনীয় হওয়া উচিত বলে মনে হয় না।

কোন পরামর্শ জন্য অনেক ধন্যবাদ।


সুসংগত উত্তর গঠনের জন্য আমি মাইএসকিউএল বা পিএইচপি সম্পর্কে যথেষ্ট পরিমাণে জানি না, তবে আমি বাজি দেব যে এটি ইউটিসি-তে এবং রূপান্তরকরণের সাথে কিছু করার আছে।
মার্ক রান্সম

4
অভ্যন্তরীণভাবে তারা সবাই ইউটিসি হিসাবে সঞ্চিত আছে, না?
এলি

4
আমি Web.ivy.net/~carton/rant/MySQL-timezones.txt বিষয়টিতে একটি আকর্ষণীয় পঠন পেয়েছি ।
micahwittman

ভাল লিঙ্ক, মাইকাউইটম্যান - খুব সহায়ক।
অ্যারন

দুর্দান্ত প্রশ্ন। একটি সাধারণ সমস্যা
ভার্দাম্পার

উত্তর:


47

মাইএসকিউএলের তারিখের প্রকারগুলি হ'ল প্রকৃতপক্ষে, ভাঙ্গা এবং সঠিকভাবে সব সময় সংরক্ষণ করতে পারে না যদি না আপনার সিস্টেমটি ইউটিসি বা জিএমটি -5 এর মতো ধ্রুবক অফসেট টাইমজোন সেট না করে। (আমি মাইএসকিউএল 5.0.45 ব্যবহার করছি)

এটি হ'ল ডাইটলাইট সেভিং টাইম শেষ হওয়ার এক ঘন্টা আগে আপনি কোনও সময় সঞ্চয় করতে পারবেন না । আপনি কীভাবে তারিখগুলি ইনপুট করেন তা বিবেচনাধীন নয়, প্রতিটি তারিখের ফাংশনটি এই সময়ের সাথে এমন আচরণ করবে যেন সেগুলি স্যুইচের পরে ঘন্টার মধ্যে রয়েছে।

আমার সিস্টেমের টাইমজোনটি America/New_York। আসুন 1257051600 (সূর্য, 01 নভেম্বর 2009 06:00:00 +0100) সঞ্চয় করার চেষ্টা করি।

এখানে মালিকানা ইন্টারভাল সিনট্যাক্স ব্যবহার করা হচ্ছে:

SELECT UNIX_TIMESTAMP('2009-11-01 00:00:00' + INTERVAL 3599 SECOND); # 1257051599
SELECT UNIX_TIMESTAMP('2009-11-01 00:00:00' + INTERVAL 3600 SECOND); # 1257055200

SELECT UNIX_TIMESTAMP('2009-11-01 01:00:00' - INTERVAL 1 SECOND); # 1257051599
SELECT UNIX_TIMESTAMP('2009-11-01 01:00:00' - INTERVAL 0 SECOND); # 1257055200

এমনকি FROM_UNIXTIME()সঠিক সময় ফিরে আসবে না।

SELECT UNIX_TIMESTAMP(FROM_UNIXTIME(1257051599)); # 1257051599
SELECT UNIX_TIMESTAMP(FROM_UNIXTIME(1257051600)); # 1257055200

অদ্ভুতভাবে যথেষ্ট, DATETIME এখনও ডিএসটি শুরু হওয়ার পরে "হারানো" সময়ের মধ্যে (কেবল স্ট্রিং আকারে!) বার সঞ্চয় করবে এবং ফিরে আসবে (উদাঃ 2009-03-08 02:59:59)। তবে কোনও মাইএসকিউএল ফাংশনে এই তারিখগুলি ব্যবহার করা ঝুঁকিপূর্ণ:

SELECT UNIX_TIMESTAMP('2009-03-08 01:59:59'); # 1236495599
SELECT UNIX_TIMESTAMP('2009-03-08 02:00:00'); # 1236495600
# ...
SELECT UNIX_TIMESTAMP('2009-03-08 02:59:59'); # 1236495600
SELECT UNIX_TIMESTAMP('2009-03-08 03:00:00'); # 1236495600

দখলের পথ: আপনি যদি প্রতি বছরে প্রতিবার সঞ্চয় এবং পুনরুদ্ধার করতে চান তবে আপনার কাছে কয়েকটি অনাকাঙ্ক্ষিত বিকল্প রয়েছে:

  1. সিস্টেমের টাইমজোনটি GMT + কিছু ধ্রুবক অফসেটে সেট করুন। যেমন ইউটিসি
  2. আইএনটি হিসাবে স্টোরের তারিখগুলি (হারুন আবিষ্কার করেছিলেন যে, টাইমস্ট্যাম্প এমনকি নির্ভরযোগ্য নয়)

  3. DATETIME টাইপ করুন কিছু ধ্রুব অফসেট সময় অঞ্চল আছে। উদাহরণস্বরূপ আপনি যদি প্রবেশ করেন তবে America/New_Yorkআপনার তারিখটি মাইএসকিউএল এর বাইরে GMT-5 এ রূপান্তর করুন , তারপরে একটি তারিখ হিসাবে সংরক্ষণ করুন (এটি প্রয়োজনীয় হতে পারে: হারুনের উত্তর দেখুন)। তারপরে আপনাকে অবশ্যই মাইএসকিউএলের তারিখ / সময় ফাংশনগুলি ব্যবহার করে অবশ্যই যত্নবান হবেন, কারণ কেউ কেউ মনে করেন যে আপনার মানগুলি সিস্টেম টাইমজোনের, অন্যরা (উদাহরণস্বরূপ, সময় গাণিতিক ফাংশনগুলি) "টাইমজোন অজোনস্টিক" (তারা সময়গুলি ইউটিসি হিসাবে আচরণ করবে)।

হারুন এবং আমি সন্দেহ করি যে স্বয়ংক্রিয়ভাবে উত্পাদক TIMESTAMP কলামগুলিও নষ্ট হয়ে গেছে। উভয়ই 2009-11-01 01:30 -0400এবং 2009-11-01 01:30 -0500দ্ব্যর্থক হিসাবে সংরক্ষণ করা হবে 2009-11-01 01:30


এই mrclay এ আপনার সমস্ত সহায়তার জন্য ধন্যবাদ। আপনি এখানে পরিস্থিতিটি খুব নির্ভুলভাবে বর্ণনা করেছেন।
অ্যারন

এটি প্রতীয়মান হয় 3 টি আসলে গাণিতিকের জন্য নিরাপদ কারণ (এটি মনে হয়) ডিএসটি কার্যকারিতা যুক্ত হওয়ার আগে ফাংশনগুলি কার্যকর করা হয়েছিল। যেমন টিএমডিআইএফএফ ('৯৯-১১-০১ 02:30:00 ',' 2009-11-01 00:30:00 ') 2:00 ফেরায়, যা ইউটিসির জন্য সঠিক, তবে আমেরিকা / নিউ_ইয়র্কে সময় 3 ঘন্টা পৃথক্.
স্টিভ ক্লে

4
-1: আপনি ভুল করেছেন যে মাইএসকিউএল তারিখ / সময় ফাংশনগুলি একটি ডেটাটাইম টাইপের উপর পরিচালিত করে, যা টাইমজোন-অজোনস্টিক। যুক্তি আপনি UNIX_TIMSTAMP করতে পার করছি তাই হয় select '2009-11-01 00:00:00' + INTERVAL 3600 SECOND;যা '2009-11-01 01:00:00'। UNIX_TIMESTAMP তারপরে সেশন টাইমজোন প্রসঙ্গে কেবল এটি ইউটিসি-তে প্রচ্ছন্ন করার চেষ্টা করে - এটি সময় অঞ্চলটির ডিএসটি বিধিগুলির প্রসঙ্গে যোগ যোগ করার চেষ্টা করে না।
kbro

@ কেব্রো ঠিক আছে, তবে সমস্যাটি রয়ে গেছে। যদি সেশন টিজে হয় America/New_York, আমি 1257051600 সঞ্চয় করার কোনও উপায় দেখতে পাচ্ছি না?
স্টিভ ক্লে

78

আমি আমার উদ্দেশ্যে এটি খুঁজে পেয়েছি। আমি যা শিখেছি তার সংক্ষিপ্তসার করব (দুঃখিত, এই নোটগুলি ভার্ভোজ; এগুলি আমার ভবিষ্যতের রেফারেলের জন্য অন্য যে কোনও কিছুর মতো)।

আমি কি আমার আগের মন্তব্যের এক বলেন পক্ষান্তরে DATETIME এ এবং টাইমস্ট্যাম্প ক্ষেত্র না ভিন্নভাবে আচরণ। টাইমস্ট্যাম্প ক্ষেত্র (দস্তাবেজগুলি ইঙ্গিত হিসাবে) আপনি "YYYY-MM-DD hh: mm: ss" ফর্ম্যাটে যা কিছু প্রেরণ করেন তা নিয়ে যান এবং এটি আপনার বর্তমান টাইমজোন থেকে ইউটিসি সময়ে রূপান্তর করুন। বিপরীতটি স্বচ্ছভাবে ঘটে যখনই আপনি ডেটা পুনরুদ্ধার করবেন। DATETIME ক্ষেত্রগুলি এই রূপান্তর করে না। আপনি তাদের প্রেরিত যা কিছু তারা নেয় এবং কেবল এটি সরাসরি সঞ্চয় করে।

না DATETIME বা TIMESTAMP ক্ষেত্রের ধরণগুলি ডিএসটি পর্যবেক্ষণ করে এমন টাইমজোনে সঠিকভাবে ডেটা সঞ্চয় করতে পারে না । আপনি যদি "২০০৯-১১-০১ 01:30:00" সঞ্চয় করেন তবে ক্ষেত্রগুলিতে সকাল 1:30 টায় আপনি যে সংস্করণটি চেয়েছিলেন তার পার্থক্য করার কোনও উপায় নেই - -04: 00 বা -05: 00 সংস্করণ।

ঠিক আছে, সুতরাং আমাদের অবশ্যই আমাদের ডেটা একটি নন ডিএসটি টাইমজোন (যেমন ইউটিসি) তে সঞ্চয় করতে হবে। টাইমস্ট্যাম্প ক্ষেত্রগুলি এই কারণে সঠিকভাবে হ্যান্ডেল করতে অক্ষম আমি ব্যাখ্যা করব: আপনার সিস্টেমটি যদি কোনও ডিএসটি টাইমজোন সেট করা থাকে তবে আপনি যা টাইমস্ট্যাম্পে রেখেছিলেন তা আপনি ফিরে না পেয়ে যাবেন না। এমনকি আপনি যদি এটি ডেটা প্রেরণ করেন যা আপনি ইতিমধ্যে ইউটিসিতে রূপান্তর করেছেন, এটি এখনও আপনার স্থানীয় সময় অঞ্চলে ডেটা ধরে নেবে এবং ইউটিসি-তে আরও একটি রূপান্তর করবে। আপনার স্থানীয় সময় অঞ্চলটি যখন ডিএসটি পর্যবেক্ষণ করে তখন এই টাইমস্ট্যাম্প-প্রয়োগিত স্থানীয়-ইউটিসি-ব্যাক-টু-স্থানীয় রাউন্ডট্রিপটি ক্ষতিকারক হয় ("২০০৯-১০-১১ 01:30:00" থেকে 2 টি ভিন্ন সম্ভাব্য সময়ে মানচিত্র)।

DATETIME এর সাথে আপনি যে কোনও টাইম জোনে আপনার ডেটা সংরক্ষণ করতে পারেন এবং আত্মবিশ্বাসী হন যে আপনি যা যা প্রেরণ করবেন তা ফিরে পেয়ে যাবেন (টাইমস্ট্যাম্পের ক্ষেত্রগুলি আপনাকে ক্ষতিকারক রাউন্ডট্রিপ রূপান্তরগুলিতে বাধ্য করবে না)। সুতরাং সমাধানটি হ'ল একটি ডেটটাইম ফিল্ড ব্যবহার করা এবং ফিল্ডে সংরক্ষণের আগে আপনার সিস্টেমের সময় অঞ্চল থেকে নন-ডিএসটি জোনে যে কোনও কিছুতে এটি সংরক্ষণ করতে চান তা রূপান্তর করুন (আমার ধারণা ইউটিসি সম্ভবত সেরা বিকল্প)। এটি আপনাকে আপনার স্ক্রিপ্টিং ভাষায় রূপান্তর যুক্তিকে তৈরি করতে দেয় যাতে আপনি স্পষ্টভাবে ইউটিসি সমতুল্যভাবে "2009-11-01 01:30:00 -04: 00" বা "" 2009-11-01 01:30: 00 -05: 00 "।

আরেকটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল মাইএসকিউএলের তারিখ / সময় গণিত ফাংশনগুলি ডিএসটি সীমানার চারপাশে সঠিকভাবে কাজ করে না যদি আপনি নিজের তারিখগুলি ডিএসটি টিজেডে সংরক্ষণ করেন। সুতরাং ইউটিসিতে আরও সমস্ত কারণ সঞ্চয় করতে হবে।

সংক্ষেপে আমি এখন এটি করি:

ডাটাবেস থেকে ডেটা পুনরুদ্ধার করার সময়:

সঠিক ইউনিক্স টাইমস্ট্যাম্প পেতে মাইএসকিউএলের বাইরে ইউটিসি হিসাবে ডাটাবেস থেকে ডেটা স্পষ্টভাবে ব্যাখ্যা করুন interpret আমি পিএইচপি এর স্ট্রোটাইম () ফাংশন বা এর জন্য ডেটটাইম ক্লাস ব্যবহার করি। এটি মাইএসকিউএলের CONVERT_TZ () বা UNIX_TIMESTAMP () ফাংশনগুলি ব্যবহার করে মাইএসকিউএলের অভ্যন্তরে নির্ভরযোগ্যভাবে করা যায় না কারণ CONVERT_TZ কেবলমাত্র 'YYYY-MM-DD hh: mm: s' এর মান আউটপুট দেবে যা অস্পষ্টতার সমস্যায় ভুগছে এবং UNIX_TIMESTAMP () ধরে নেয় ইনপুটটি সিস্টেম টাইমজোনটিতে রয়েছে, টাইমজোনটি ডেটা আসলে (ইউটিসি) সঞ্চিত ছিল না।

ডাটাবেসে ডেটা সংরক্ষণ করার সময়:

আপনি আপনার তারিখটি মাইএসকিউএল এর বাইরে সুনির্দিষ্ট ইউটিসি সময়ে রূপান্তর করুন। উদাহরণস্বরূপ: পিএইচপি-র ডেটটাইম ক্লাসের সাহায্যে আপনি "২০০৯-১১-০১ 1:30:00 EST" "2009-11-01 1:30:00 EDT" থেকে আলাদাভাবে নির্দিষ্ট করতে পারেন, তারপরে এটি ইউটিসিতে রূপান্তর করুন এবং সঠিক ইউটিসি সময় সাশ্রয় করুন আপনার DATETIME ক্ষেত্রে।

ভাই। প্রত্যেকের ইনপুট এবং সাহায্যের জন্য অনেক ধন্যবাদ। আশা করি এটি অন্য কাউকে কিছুটা মাথা ব্যথা থেকে বাঁচাতে পারে।

বিটিডাব্লু, আমি এটি মাইএসকিউএল 5.0.22 এবং 5.0.27 এ দেখছি


13

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

SET SESSION time_zone = '+0:00'

তারপরে আপনি এটি ইউনিক্স টাইমস্ট্যাম্পগুলি প্রেরণ করুন এবং সবকিছু ঠিকঠাক করা উচিত।


এই পরামর্শ ভাল কাজ করে। প্রদত্ত বিবৃতিটি দিয়ে আমার পুলটিতে সমস্ত সংযোগ দেওয়ার পরে সমস্যার সমাধান হবে।
তুষারপাত

4

পরিবর্তিত রেকর্ড এবং ETL একটি ডেটাওয়্যারহাউসে ট্র্যাক করতে আমরা (যেমন :) TIMESTAMPদিয়ে কলামগুলি ব্যবহার করার কারণে এই থ্রেডটি আমাকে ফ্রিক করে তুলেছে।On UPDATE CURRENT_TIMESTAMPrecordTimestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

যদি কেউ বিস্মিত হন, এই ক্ষেত্রে, TIMESTAMPসঠিকভাবে আচরণ করুন এবং আপনি TIMESTAMPইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করে দুটি অনুরূপ তারিখের মধ্যে পার্থক্য করতে পারেন :

select TestFact.*, UNIX_TIMESTAMP(recordTimestamp) from TestFact;

id  recordTimestamp         UNIX_TIMESTAMP(recordTimestamp)
1   2012-11-04 01:00:10.0   1352005210
2   2012-11-04 01:00:10.0   1352008810

3

তবে আমি কীভাবে 01:30:00 -04: 00 এ কিছু সংরক্ষণ করব?

আপনি ইউটিসি তে রূপান্তর করতে পারেন:

SELECT CONVERT_TZ('2009-11-29 01:30:00','-04:00','+00:00');


আরও ভাল, তারিখগুলি একটি TIMESTAMP ক্ষেত্র হিসাবে সংরক্ষণ করুন । এটি সর্বদা ইউটিসিতে সঞ্চিত থাকে এবং ইউটিসি গ্রীষ্ম / শীতের সময় সম্পর্কে জানে না।

আপনি ইউটিসি থেকে স্থানীয় সময়ে CONVERT_TZ ব্যবহার করে রূপান্তর করতে পারেন :

SELECT CONVERT_TZ(UTC_TIMESTAMP(),'+00:00','SYSTEM');

যেখানে '+00: 00' ইউটিসি, টাইমজোন থেকে, এবং মাইএসকিউএল চালিত ওএসের স্থানীয় টাইমজোন হ'ল 'সিস্টেম'।


উত্তরের জন্য ধন্যবাদ. সর্বোত্তম হিসাবে আমি বলতে পারি, ডক্স যা বলছে তা সত্ত্বেও, টাইমস্ট্যাম্প এবং ডেটটাইম ক্ষেত্রগুলি একই রকম আচরণ করছে: তারা তাদের ডেটা ইউটিসি-তে সংরক্ষণ করে, তবে তারা আশা করে যে তাদের ইনপুটটি স্থানীয় সময়ে হবে এবং তারা স্বয়ংক্রিয়ভাবে এটি ইউটিসিতে রূপান্তর করবে - যদি আমি রূপান্তর করি ইউটিসি প্রথমে ডাটাবেসের কোনও ধারণা নেই যে আমি এটি করেছি এবং এটি আরও 4 ঘন্টা যোগ করে (বা 5, আমরা ডিএসটি থাকি কি না তার উপর নির্ভর করে) more সুতরাং সমস্যাটি রয়ে গেছে: আমি কীভাবে 2009-11-01 01:30:00 -04: 00 ইনপুট হিসাবে নির্দিষ্ট করব?
অ্যারন

ঠিক আছে, আমি আবিষ্কার করেছি যে আমার বেশিরভাগ বিভ্রান্তির উত্স হ'ল ইউনিক্স টাইমস্ট্যাম্প () ফাংশনটি সর্বদা বর্তমান টাইম জোনের সাথে সম্পর্কিত তার তারিখের প্যারামিটারের ব্যাখ্যা করে থাকে আপনি কোনও টাইমস্ট্যাম্প বা একটি ডেটাটাইম ক্ষেত্র থেকে ডেটা টানছেন কিনা তা inter । আমি এখনই এটি সম্পর্কে চিন্তাভাবনা করি। আমি আরও পরে আপডেট করব।
হারুন

2

মাইএসকিউএল মাইএসকিএল ডিবি থেকে টাইম_ জোন_নাম টেবিল ব্যবহার করে সহজাতভাবে এই সমস্যাটি সমাধান করে। দিবালোক সংরক্ষণের সময় সম্পর্কে চিন্তা না করে ডেটটাইম আপডেট করতে CRUD চলাকালীন CONVERT_TZ ব্যবহার করুন।

SELECT
  CONVERT_TZ('2019-04-01 00:00:00','Europe/London','UTC') AS time1,
  CONVERT_TZ('2019-03-01 00:00:00','Europe/London','UTC') AS time2;

1

আমি পৃষ্ঠাগুলির দর্শন লগিংয়ের গণনা এবং গ্রাফের মধ্যে গণনাগুলি প্রদর্শন করতে (ফ্লোট jQuery প্লাগইন ব্যবহার করে) কাজ করছিলাম। আমি টেস্টের ডেটা দিয়ে টেবিলটি পূর্ণ করে দিয়েছিলাম এবং সবকিছু ঠিকঠাক দেখতে পেয়েছি তবে আমি লক্ষ্য করেছি যে গ্রাফের শেষে পয়েন্টগুলি এক্স-অক্ষের লেবেল অনুসারে একদিন বন্ধ ছিল। পরীক্ষার পরে আমি লক্ষ্য করেছি যে 2015-10-25 দিনের জন্য ভিউ গণনাটি ডাটাবেস থেকে দুবার পুনরুদ্ধার করা হয়েছিল এবং ফ্লোটে চলে গেছে, সুতরাং এই তারিখের পরে প্রতিদিন একদিন ডান দিকে সরানো হয়েছিল।
কিছুক্ষণের জন্য আমার কোডটিতে একটি বাগ অনুসন্ধান করার পরে আমি বুঝতে পারি যে এই তারিখটি যখন ডিএসটি হয় তখন। তারপরে আমি এই এসও পৃষ্ঠায় এসেছি ...
... তবে প্রস্তাবিত সমাধানগুলি আমার যা প্রয়োজন তা করার জন্য ওভারকিল ছিল বা তাদের অন্যান্য অসুবিধাগুলি ছিল। অস্পষ্ট টাইমস্ট্যাম্পগুলির মধ্যে পার্থক্য করতে সক্ষম না হওয়ায় আমি খুব চিন্তিত নই। আমার কেবল প্রতিদিন গণনা করা এবং রেকর্ড প্রদর্শন করা দরকার।

প্রথমত, আমি তারিখের সীমাটি পুনরুদ্ধার করেছি:

SELECT 
    DATE(MIN(created_timestamp)) AS min_date, 
    DATE(MAX(created_timestamp)) AS max_date 
FROM page_display_log
WHERE item_id = :item_id

তারপরে, লুপের জন্য, একদিনের ধাপে ) min_dateদিয়ে শুরু করে , শেষ max_dateকরে ( 60*60*24), আমি গণনাগুলি পুনরুদ্ধার করছি:

for( $day = $min_date_timestamp; $day <= $max_date_timestamp; $day += 60 * 60 * 24 ) {
    $query = "
        SELECT COUNT(*) AS count_per_day
        FROM page_display_log
        WHERE 
            item_id = :item_id AND
            ( 
                created_timestamp BETWEEN 
                '" . date( "Y-m-d 00:00:00", $day ) . "' AND
                '" . date( "Y-m-d 23:59:59", $day ) . "'
            )
    ";
    //execute query and do stuff with the result
}

আমার চূড়ান্ত এবং দ্রুত সমাধান করার জন্য আমার সমস্যা এই ছিল:

$min_date_timestamp += 60 * 60 * 2; // To avoid DST problems
for( $day = $min_date_timestamp; $day <= $max_da.....

তাই আমি আছি দিনের শুরুতে লুপ চোখে পড়ার মত নয়, কিন্তু দুই ঘন্টা পরে । দিনটি এখনও একই, এবং আমি এখনও সঠিক গণনাগুলি পুনরুদ্ধার করছি, যেহেতু আমি টাইমস্ট্যাম্পের আসল সময় নির্বিশেষে দিনের 00:00:00 থেকে 23:59:59 এর মধ্যে রেকর্ডের জন্য স্পষ্টভাবে ডেটাবেসকে জিজ্ঞাসা করি। এবং সময়টি যখন এক ঘন্টা এগিয়ে যায়, তখনও আমি সঠিক দিনটিতে আছি।

দ্রষ্টব্য: আমি জানি এটি 5 বছরের পুরনো থ্রেড, এবং আমি জানি এটি ওপিএস প্রশ্নের উত্তর নয়, তবে এটি আমার মতো লোকদের সাহায্য করতে পারে যারা এই পৃষ্ঠার সম্মুখীন হয়েছিল আমি বর্ণিত সমস্যার সমাধান খুঁজছি for


সম্ভবত আসল প্রশ্নের সাথে প্রাসঙ্গিক নয়, তবে এটি মারাত্মকভাবে অদক্ষ এবং কারও এটির অনুলিপি করা উচিত নয়! : এর পরিবর্তে, যেমন একটি একক ক্যোয়ারী জারি
Doin থেকে

"SELECT CAST(created_timestamp AS date) day,COUNT(*) WHERE item_id=:item_id AND (created_timestamp BETWEEN '".date("Y-m-d 00:00:00", $min_date_timestamp)."' AND '".date("Y-m-d 23:59:59", $max_date_timestamp)."') GROUP BY day ORDER BY day";
Doin থেকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.