মাইএসকিউএল গতকালের তারিখটি নির্বাচন করছে


104

গতকাল যে তারিখগুলি রয়েছে তার মানগুলি আমি কীভাবে প্রদর্শিত এবং গণনা করতে পারি? আমি time()ডাটাবেসে তারিখ toোকাতাম। উদাহরণ:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

আমি টেবিলটিতে একাধিক থাকা কতগুলি ইউআরএল এবং গতকাল সেই URL টির কতগুলি পরিদর্শন করা হয়েছে তা প্রদর্শন করতে চাই। উদাহরণ ফলাফল:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

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

উত্তর:


169

গতকালের তারিখ পাওয়ার সহজতম ও সর্বোত্তম উপায় হ'ল:

subdate(current_date, 1)

আপনার প্রশ্নটি হবে:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

কৌতূহলের জন্য, সেই কারণটি যা sum(condition)আপনাকে সারিগুলি গণনা দেয় যা শর্তটি পূরণ করে, যা অন্যথায় একটি জটিল এবং কথামূলক caseবিবৃতি প্রয়োজন, এটি হল যে মাইএসকিএল-তে বুলিয়ান মানগুলি 1সত্য এবং 0মিথ্যা জন্য, সুতরাং একটি শর্তের সংমিশ্রণ কার্যকরভাবে গণনা করে যে কতবার এটা সত্যি. এই নিদর্শনটি ব্যবহার করা আপনার এসকিউএল কোডটি পরিষ্কার করতে পারে।


92
SELECT SUBDATE(NOW(),1);

যেখানে এখন () ফাংশন টাইমস্ট্যাম্পে সিস্টেমের বর্তমান তারিখ এবং সময় ফিরিয়ে দেয় ...

তুমি ব্যবহার করতে পার:

SELECT SUBDATE(CURDATE(),1)

4
আমার জন্য কাজ করেছেন। অনেক ধন্যবাদ
মার্বেল জর্জে

21

তুমি ব্যবহার করতে পার:

SELECT SUBDATE(NOW(), 1);

বা

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

বা

SELECT NOW() - INTERVAL 1 DAY;

বা

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

12

আপনি এক্সপ্রেশন ব্যবহার করে গতকালের তারিখ পেতে পারেন CAST(NOW() - INTERVAL 1 DAY AS DATE)। সুতরাং এর মতো কিছু কাজ করতে পারে:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));


9

শেষ বা পরবর্তী তারিখ, সপ্তাহ, মাস এবং বছরের গণনা। এটি কারও পক্ষে সহায়ক হতে পারে।

বর্তমান তারিখ:

select curdate();

গতকাল:

select subdate(curdate(), 1)

আগামীকাল:

select adddate(curdate(), 1)

গত 1 সপ্তাহ:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

পরবর্তী 1 সপ্তাহ:

between adddate(curdate(), 7) and adddate(curdate(), 1)

সর্বশেষ 1 মাস:

between subdate(curdate(), 30) and subdate(curdate(), 1)

পরবর্তী 1 মাস:

between adddate(curdate(), 30) and adddate(curdate(), 1)

বর্তমান মাস:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

সর্বশেষ 1 বছর:

between subdate(curdate(), 365) and subdate(curdate(), 1)

পরের 1 বছর:

between adddate(curdate(), 365) and adddate(curdate(), 1)

7

নির্বাচিত উত্তর সঠিক এবং আরও সংক্ষিপ্ত হলেও আমি অন্য উত্তরে উল্লিখিত কাঠামোর পক্ষে যুক্তি দেব:

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

আপনার যদি টাইমস্ট্যাম্প ছাড়া খালি তারিখের প্রয়োজন হয় তবে আপনি এটি নিম্নলিখিত হিসাবে লিখতে পারেন:

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

ব্যবহার করার জন্য কারণ CASTবনাম SUBDATEহয় CASTANSI এসকিউএল সিনট্যাক্স হয়। SUBDATEতারিখের গাণিতিক উপাদানটির একটি মাইএসকিউএল সুনির্দিষ্ট বাস্তবায়ন CAST। এএনএসআই সিনট্যাক্স ব্যবহারের অভ্যাসে প্রবেশ করা মাথাব্যথা হ্রাস করতে পারে আপনার যদি কখনও আলাদা ডেটাবেসে মাইগ্রেশন করতে হয়। পেশাদার অনুশীলন হিসাবে অভ্যাসে থাকাও ভাল কারণ আপনি ভবিষ্যতে অবশ্যই অন্যান্য ডিবিএমএস'র সাথে কাজ করবেন work

বড় ডিবিএমএস সিস্টেমগুলির মধ্যে কোনওটিই এএনএসআই সম্পূর্ণরূপে মেনে চলতে পারে না, তবে তাদের বেশিরভাগ এএনএসআই সিনট্যাক্সের বিস্তৃত সেট বাস্তবায়ন করে যেখানে মাইএসকিউএল এবং এর বংশধরদের বাইরে প্রায় কোনওটিই (মারিয়াডিবি, পারকোনা ইত্যাদি) মাইএসকিউএল-নির্দিষ্ট সিনট্যাক্স প্রয়োগ করে না।


কেন একজন একে অপরকে বেছে নেবে সে সম্পর্কে ভাল ব্যাখ্যা।
সাবেলফোস্টে

4

আমি কাজের উপর পেতে না পারায় আমি সিডিওউইর উপরের উত্তরগুলির মধ্যে একটি রূপান্তর করেছি। এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে। আমার সন্দেহ হয় UNIX_TIMESTAMP ফাংশনটি ব্যবহৃত হওয়ার সাথে এটি করা সম্ভব।

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.