বর্তমান দিনের টাইমস্ট্যাম্প রয়েছে এমন সারিগুলি কীভাবে নির্বাচন করবেন?


104

আমি একটি ডাটাবেস টেবিল থেকে শুধুমাত্র আজকের রেকর্ড নির্বাচন করার চেষ্টা করছি।

বর্তমানে আমি ব্যবহার করি

SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));

তবে এটি সর্বশেষ 24 ঘন্টা ফলাফল গ্রহণ করে এবং সময়কে উপেক্ষা করে আজ থেকে কেবলমাত্র ফলাফলগুলি বেছে নেওয়া আমার প্রয়োজন। কেবলমাত্র তারিখের ভিত্তিতে আমি কীভাবে ফলাফলগুলি নির্বাচন করতে পারি?

উত্তর:


191

ব্যবহার DATEএবংCURDATE()

SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()

আমি DATE এখনও INDEX ব্যবহার করে অনুমান করি

ডেমোতে কার্যকর করার পরিকল্পনা দেখুন


পার্থক্যটি দেখুন: এসকিউএল- ফিডাল ২ য় ক্যোয়ারিতে ফিল্টারড = 25 টি লক্ষ্য করুন।
ypercubeᵀᴹ

@ টিউমারকিউ ওহ আমি এটি মিস করেছি তবে আমি ভাবছিলাম যে অতিরিক্ত মূল্য কেন Using where; Using index?
জন উ

1
সূচিটি সারিগুলি নির্বাচন করতে ব্যবহৃত হয়। তবে আপনার প্রশ্নের সাথে পুরো সূচকটি স্ক্যান করা হয়েছে (এবং শর্তটি মূল্যায়নের জন্য সমস্ত মান DATE () দিয়ে রূপান্তরিত হয়)। আমি আমার উত্তরটি আরও ভাল উদাহরণ দিয়ে আপডেট করব।
ypercubeᵀᴹ

1
সমস্ত যথাযোগ্য সম্মানের সাথে, পারফরম্যান্সের কারণে ইপারকিউব সমাধানটি আরও ভাল, যদি আপনার টেবিলটিতে কয়েক হাজার লাইন থাকে তবে আপনার অবশ্যই এই দিকে যাওয়া উচিত
ভিনসেন্ট

1
`important গুরুত্বপূর্ণ কারণ timestamp(এবং dateআমার ক্ষেত্রে হিসাবে) একটি মাইএসকিউএল সংরক্ষিত শব্দ
ভিক্টর ফেরেরিরা

55

আপনি যদি চান একটি সূচক ব্যবহার করা হয় এবং কোয়েরিটি কোনও টেবিল স্ক্যান না করে:

WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY

প্রকৃত বাস্তবায়নের পরিকল্পনাগুলির মধ্যে পার্থক্যটি দেখানোর জন্য আমরা একটি এসকিউএল-ফিডল (একটি অত্যন্ত সহায়ক সাইট) দিয়ে পরীক্ষা করব :

CREATE TABLE test                            --- simple table
    ( id INT NOT NULL AUTO_INCREMENT
    ,`timestamp` datetime                    --- index timestamp
    , data VARCHAR(100) NOT NULL 
          DEFAULT 'Sample data'
    , PRIMARY KEY (id)
    , INDEX t_IX (`timestamp`, id)
    ) ;

INSERT INTO test
    (`timestamp`)
VALUES
    ('2013-02-08 00:01:12'),
    ---                                      --- insert about 7k rows
    ('2013-02-08 20:01:12') ;

এখন 2 সংস্করণ চেষ্টা করুন।


সংস্করণ 1 সহ DATE(timestamp) = ?

EXPLAIN
SELECT * FROM test 
WHERE DATE(timestamp) = CURDATE()            ---  using DATE(timestamp)
ORDER BY timestamp ;

ব্যাখ্যা করা:

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
1   SIMPLE       test   ALL

ROWS  FILTERED  EXTRA
6671  100       Using where; Using filesort

এটি সমস্ত ( 676767১ ) সারি ফিল্টার করে এবং তারপরে একটি ফাইলসোর্ট করে (ফিরে আসা সারিগুলি কয়েকটি হওয়ায় এটি কোনও সমস্যা নয়)


সংস্করণ 2 সহ timestamp <= ? AND timestamp < ?

EXPLAIN
SELECT * FROM test 
WHERE timestamp >= CURDATE()
  AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;

ব্যাখ্যা করা:

ID  SELECT_TYPE  TABLE  TYPE  POSSIBLE_KEYS  KEY  KEY_LEN  REF 
1   SIMPLE       test   range t_IX           t_IX    9 

ROWS  FILTERED  EXTRA
2     100       Using where

এটি সূচীতে একটি ব্যাপ্তি স্ক্যান ব্যবহার করে এবং তারপরে টেবিল থেকে কেবল একই সারিগুলি পড়ে।


স্কেল-ফিডলের জন্য দুর্দান্ত ব্যাখ্যা এবং ধন্যবাদ। আপনার স্কিমা সম্পর্কে একটি মন্তব্য যা আমাকে মুহুর্তের জন্য ছুঁড়ে ফেলেছে , প্রাথমিক কীটি সূচীতে অন্তর্নিহিত হিসাবে, INDEX t_IX (timestamp, id)এটি হওয়া উচিত (হওয়া উচিত)? INDEX t_IX (timestamp)বা এমন কোনও কারণ আছে যা আমি বুঝতে পেরেছি না? আমি এটি
স্কুয়েল

1
@ নাটব্রো হ্যাঁ, যদি টেবিলটি ইনোডিবি ইঞ্জিন ব্যবহার করে তবে id(এটি পিকে এবং কারণ এইভাবে টেবিলটির ক্লাস্টারড ইনডেক্স) যাইহোক সূচীতে যুক্ত করা হবে। সুতরাং, এটি স্পষ্টভাবে যুক্ত করতে কোনও ক্ষতি হয় না (এবং এটি কিছু অপ্টিমাইজারের অন্ধ দাগও পেতে পারে)। এটি অবশ্যই এই ক্ষেত্রে / প্রশ্নের সাথে প্রাসঙ্গিক নয়।
ypercubeᵀᴹ

কেন timestamp < CURDATE() + INTERVAL 1 DAYকেউ প্রয়োজন তা ব্যাখ্যা করতে পারেন ?
নাইটওয়ल्फ

@ নাইটউল্ফ কারণ আপনার ভবিষ্যতে টাইমস্ট্যাম্পের মান যেখানে সারি সঞ্চিত থাকতে পারে। প্রশ্নটি "কেবলমাত্র আজকের রেকর্ডগুলি" চেয়েছে ।
ypercubeᵀᴹ

@ টাইপকিউব ᵀᴹ আহা, নিখুঁতভাবে বিবেচনা করেন নি কারণ টাইমস্ট্যাম্প ভবিষ্যতের তারিখগুলি করবে না। যাইহোক ভাল পয়েন্ট মনে রাখা।
নাইটওয়ल्फ

11
SELECT * FROM `table` WHERE timestamp >= CURDATE()

এটি সংক্ষিপ্ত, 'এবং টাইমস্ট্যাম্প <CURDATE () + ইন্টারভাল 1 দিন' ব্যবহার করার দরকার নেই

কারণ CURDATE () সর্বদা বর্তমান দিন ফিরে আসে

মাইএসকিউএল কার্যেট () ফাংশন


ক) প্রশ্নটি "কেবলমাত্র আজকের রেকর্ডস" এর জন্য জিজ্ঞাসা করে এবং আপনার কোডটি ভবিষ্যতের তারিখও পায়। খ) আপনার তুলনা কাজ করে না, আপনাকে অবশ্যই এটি অবশ্যই তারিখের (টাইমস্ট্যাম্প) দিয়ে করতে হবে অন্য কথায়: আপনি যদি নিজের উত্তরটি ঠিক করেন তবে আপনি @ জনউইউর আসল উত্তর পাবেন।
কাটাপোফ্যাটিকো

2

আমরা এই বিড়ালটিকে কতভাবে চামড়া করতে পারি? এখানে আরও একটি বৈকল্পিক।

নির্বাচন করুন * tableওখানে থেকে তারিখ (FROM_UNIXTIME ( timestamp)) = '2015-11-18';


2

আপনি যদি কোনও নির্দিষ্ট তারিখের সাথে তুলনা করতে চান তবে আপনি সরাসরি এটি লিখতে পারেন:

select * from `table_name` where timestamp >= '2018-07-07';

// এখানে টাইমস্ট্যাম্প টাইমস্ট্যাম্প হিসাবে টাইপ করা কলামের নাম

অথবা

আজকের তারিখ আনার জন্য, CURDATE () ফাংশনটি উপলভ্য, তাই:

select * from `table_name` where timestamp >=  CURDATE();

1

কেবল এটিকে একটি তারিখে ফেলে দিন:

SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)



0

ভিজ্যুয়াল স্টুডিও 2017-তে, বিকাশের জন্য অন্তর্নির্মিত ডাটাবেসটি ব্যবহার করে আমার বর্তমান প্রদত্ত সমাধানটি নিয়ে সমস্যা ছিল, কাজটি করার জন্য আমাকে কোডটি পরিবর্তন করতে হয়েছিল কারণ এটি ত্রুটিটি ছুঁড়ে দিয়েছে যে তারিখ () কোনও ফাংশন-এ অন্তর্নিহিত ছিল না।

এখানে আমার সমাধান:

where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)


আপনি সম্ভবত মাইএসকিউএল ব্যবহার করছেন না তবে কিছু অন্যান্য ডিবিএমএস (সম্ভবত এসকিউএল সার্ভার?) প্রশ্নের ট্যাগগুলি লক্ষ্য করুন।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.