এসকিউএলাইট ডেটটাইম তুলনা


117

আমি তুলনা হিসাবে একটি ডেটটাইম স্ট্রিং ব্যবহার করে একটি স্ক্লাইট ডাটাবেসের বিরুদ্ধে ক্যোয়ারী থেকে নির্ভরযোগ্য ফলাফল পেতে পারি না:

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

আমি কীভাবে স্কাইলাইটের সাথে ডেটটাইম তুলনা পরিচালনা করব?

আপডেট: ফিল্ড মাইডেট একটি ডেটটাইম ডেটাটাইপ


1
আপনার mydateকলামে কোন তারিখের ফর্ম্যাটটি সংরক্ষণ করা হয় ? আমি অনুমান করছি এটি কোনও এসকিউএল
ওএমজি পনিস

1
ওএমজি, এটি একটি ডেটটাইপ টাইপ
ব্র্যাড

4
ডেটটাইম () এর ব্যবহারের ফলে আপনি যে সঠিক মানটি দিয়েছেন তার ফলস্বরূপ এটি এখানে ব্যবহার করার কোনও কারণ নেই: পরিবর্তে কেবল স্ট্রিংটি ব্যবহার করুন। এবং যদি আপনি কেবল তারিখগুলি নিয়ে কাজ করছেন তবে আপনার শূন্য সময়ের অংশগুলি মুছে ফেলা উচিত --- মূলত উভয় পক্ষই একই ফর্ম্যাটে রয়েছে কিনা তা নিশ্চিত করে নিন। (অন্যথায় '2009-11-13', মাইডেটের জন্য, এর চেয়ে কম হবে '2009-11-13 00:00:00'))

1
এসকিউএলাইট সহ ভিজ্যুয়াল স্টুডিওতে আমার জন্য একটি তারিখ / সময় ক্যোয়ারী চালানোর জন্য কাজ করার জন্য, Datetime()@ ব্র্যাড যেমন সমাধানের উল্লেখে অন্তর্ভুক্ত করেছেন তেমনভাবে আমাকে ব্যবহার করতে হবে । অন্যথায় ভিএস2012 অভিযোগ করে। ধন্যবাদ ব্র্যাড
ক্যাপ্টেনব্লি

সমাধানটি সাথে আপডেট করার জন্য আপনাকে ধন্যবাদ। NET- এ তারিখের জন্য ডিফল্ট ফর্ম্যাটটি আসলে "<" বনাম ">" এর বিপরীতে আসবে বলে কত আশ্চর্য।
ডেভ ফ্রেডেল

উত্তর:


57

SQLite DATETIME নিবেদিত করেছি না ধরনের , কিন্তু একটি আছে কয়েক DATETIME ফাংশন । স্ট্রিং উপস্থাপনা ফর্ম্যাটগুলি অনুসরণ করুন (আসলে কেবলমাত্র 1-10 ফর্ম্যাটগুলি) সেই ফাংশনগুলি দ্বারা বোঝা (একটি স্ট্রিং হিসাবে মান সংরক্ষণ করা) এবং তারপরে আপনি এগুলি ব্যবহার করতে পারেন, এবং স্ট্রিংগুলিতে ডিক্সোগ্রাফিক তুলনা ডেটটাইম তুলনার সাথে মিলবে (যতক্ষণ আপনি না করেন) তারিখগুলি সময়ের সাথে বা তারিখের সাথে সময়ের সাথে তুলনা করার চেষ্টা করুন, যা যাইহোক পুরোপুরি অর্থবোধ করে না)।

আপনি কোন ভাষা ব্যবহার করেন তার উপর নির্ভর করে আপনি স্বয়ংক্রিয় রূপান্তরও পেতে পারেন । (উদাহরণস্বরূপ এসকিউএল বিবৃতিতে তুলনা করার ক্ষেত্রে এটি প্রযোজ্য না তবে এটি আপনার জীবনকে আরও সহজ করে তুলবে))


10
প্রথম বাক্যটি পড়া সকলের জন্য, '17 datedatetime
এসকিউএলাইটে

3
গতকাল এখানে টাইপ অ্যাফিনিটি সম্পর্কে পড়ছিলাম: sqlite.org/datatype3.html মূলত, আপনার যদি কোনও তারিখের প্রয়োজন হয়, আপনি কলামে একটি date(বা datetime) ঘোষণা করুন যা অভ্যন্তরীণভাবে বিবেচিত হয় text। এটি আমার প্রয়োজনের সাথে খাপ খায়।
এলিসিয়ানোয়

100

এই সমস্যাটি সমাধান করার জন্য, আমি খেজুর হিসাবে সংরক্ষণ করি YYYYMMDD। সুতরাং, where mydate >= '20090101' and mydate <= '20050505'

এটি সর্বদা সহজ কাজ করে। ব্যবহারকারীরা কীভাবে তাদের তারিখগুলি প্রবেশ করতে পারে তা হ্যান্ডেল করতে আপনাকে কেবল একটি পার্সার লিখতে হবে যাতে আপনি সেগুলিতে রূপান্তর করতে পারেন YYYYMMDD


2
প্রদত্ত ফর্ম্যাটটি মানসম্পন্ন করা হয়েছে, YYYY-MM-DD ড্যাশ ছাড়াই কীভাবে আলাদা হবে? তুলনা কি শেষ হবে না?
দামন

2
@ ড্যামন: আমি মনে করি তিনি ডেটাটাইপ
থম্বমুনকিজ

1
না, এগুলি স্ট্রিং - আপনি এটি উদ্ধৃতিতে দেখতে পারেন - তবে এটি দুর্দান্ত ধারণা: এই আদেশের সাথে ওয়াই এমএম ডিডি তারিখগুলির তুলনা করা সম্ভব। @ দামন এটিও ড্যাশগুলির সাথে কাজ করা উচিত!
শেদাট কিলিঙ্ক

1
আমি যদি আমি একই জিনিসটি করতে পারি তবে আমি অবাক হয়েছি যদি আমি সঞ্চয় করতে yyyyMMddHHmmss ফর্ম্যাটটি ব্যবহার করি, যাতে আমি সময়ের অংশটিও অন্তর্ভুক্ত করতে পারি। এটি কি একটি উপচে পড়া বা কিছু কারণ হতে পারে?
ফিজাল

2
আমি ব্যবহার করি: yyyymmddHHmm কোনও সমস্যা নেই, আমি yyyymmddHHmmss একই কাজ করবে বলে আশা করি
স্টিভ

39

আমার সম্প্রতি একই সমস্যা ছিল এবং আমি এটি এর মতো সমাধান করেছি:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

% s অবশ্যই একক উদ্ধৃতি অক্ষরের মধ্যে আবদ্ধ থাকতে হবে, যেমন: স্ট্রফটাইম ('% s', তারিখ)
এমভ্ল্যাডিক

এটা কাজ করে। নির্দিষ্ট তারিখের পরে সমস্ত সারি নির্বাচন করার জন্য সমাধান পরিবর্তিত হয়েছে: টেবিল থেকে * নির্বাচন করুন যেখানে স্ট্রফটাইম ('% s', যুক্ত)> স্ট্রফটাইম ('% s', "2017-01-01 00:00:00")
নতুন প্রোগ্রামার

আমি strftimeউদাহরণ হিসাবে যেমন একটি দফা ব্যবহার করে মূল্যায়ন করছি , এবং আমার একটি প্রশ্ন আছে: এটি কি এর strftimeমতো ব্যবহার করা দক্ষ ? এটি প্রতিটি সারির জন্য একবার বা একবার কোয়েরি মূল্যায়ন করা হয়?
আলভারো গুতেরেস পেরেজ

এটি সঠিক উত্তর হিসাবে গ্রহণ করা উচিত!
লুকা শ

20

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

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

এটি আইওএস-এ আমার জন্য কাজ করেছে, অবজেক্টিভ-সি আমার প্রশ্নটি নিম্নরূপ: গাড়ি_সেকলে_tbl থেকে COUNT নির্বাচন করুন (গাড়ি বিক্রয়) 'তারিখের আগে' 2015-04-01 'এবং' 2015-04-30 'এবং কারটাইপ = "হাইব্রিড"
রণদিকা বিষ্মান

9

স্ক্লাইটটি তারিখের সাথে তুলনা করতে পারে না। আমাদের সেকেন্ডে রূপান্তর করতে হবে এবং এটিকে পূর্ণসংখ্যা হিসাবে কাস্ট করতে হবে।

উদাহরণ

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;


6

আমার এমন পরিস্থিতি আছে যেখানে আমি আজ থেকে শেষ পর্যন্ত দু'দিন আগে এবং তার আগে পর্যন্ত ডেটা চাই। আমি নিম্নলিখিত পৌঁছেছি।

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

ঠিক আছে, প্রযুক্তিগতভাবে আমিও আগামীকাল মধ্যরাতে টানছি মূল পোস্টারের মতো, যদি কোনও তথ্য থাকে তবে আমার ডেটা সমস্ত allতিহাসিক।

মূল বিষয়টি মনে রাখতে হবে, প্রাথমিক পোস্টারটি ২০০৯-১১-১৯ 00:00:00 এর পরে সমস্ত ডেটা বাদ দেয়। সুতরাং, 15 তারিখের মধ্যরাতে রেকর্ড করা কোনও ডেটা অন্তর্ভুক্ত ছিল তবে 15 তারিখের মধ্যরাতের পরে কোনও ডেটা ছিল না। যদি তাদের প্রশ্নটি ছিল,

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')

স্পষ্টতার জন্য দফাটির মধ্যে ব্যবহার করুন।

এটা কিছুটা ভাল হত। এটি এখনও একাদশ লিপ সেকেন্ড গ্রহণ করে না যেখানে এক ঘন্টা আসলে actually০ সেকেন্ডেরও বেশি সময় নিতে পারে তবে এখানে আলোচনার জন্য যথেষ্ট ভাল :)


2

আমাকে এতে সময়-অঞ্চল সম্পর্কিত তথ্য সহ সময়টি সঞ্চয় করতে হয়েছিল এবং নীচের ফর্ম্যাটটির সাথে কাজ করা প্রশ্নগুলি পেতে সক্ষম হয়েছি:

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

সময়টি নিম্নোক্ত বিন্যাসে নিয়মিত TEXT হিসাবে ডাটাবেসে সংরক্ষণ করা হয়:

2015-03-06 20:12:15 -04:00

2

নীচে তারিখগুলির তুলনা করার পদ্ধতি রয়েছে তবে এর আগে আমাদের ডিবিতে সঞ্চিত তারিখের ফর্ম্যাটটি সনাক্ত করতে হবে

আমার তারিখগুলি এমএম / ডিডি / ওয়াইওয়াই এইচএইচ: এমএম ফর্ম্যাটে সঞ্চিত আছে সুতরাং এটির ফর্ম্যাটে তুলনা করতে হবে

  1. প্রশ্নের নীচে তারিখটিকে এমএম / ডিডি / ওয়াইওয়াই ফর্ম্যাটে রূপান্তর করে এবং গত পাঁচ দিন থেকে আজ অবধি ডেটা পান। বিটউইন অপারেটর সহায়তা করবে এবং আপনি কেবল সূচনার তারিখ এবং শেষের তারিখ নির্দিষ্ট করতে পারবেন।

    select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime')); 
  2. ক্যোয়ারির নীচে অপারেটর (>) এর চেয়ে বেশি ব্যবহার করবে।

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

আমি যে সমস্ত গণনা করেছি তা বর্তমান সময়কে ব্যবহার করছে, আপনি নিজের প্রয়োজন অনুযায়ী ফর্ম্যাট এবং তারিখটি পরিবর্তন করতে পারেন।

আশা করি এটা তোমাকে সাহায্য করবে

Summved


1

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


0

আমার জিজ্ঞাসা আমি নিম্নলিখিত হিসাবে করেছি:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

@ ইফ্রেডির উত্তর দিয়ে আমি ইঙ্গিতটি পেয়েছি। আমি যা করেছি তা হ'ল, আমি চেয়েছিলাম যে এই কোয়েরিটি আইওএস-তে চালানো হোক, উদ্দেশ্য-সি ব্যবহার করে। এবং এটি কাজ করে!

আশা করি যে কেউ আইওএস ডেভলপমেন্ট করেন, তিনিও এই উত্তরটি ব্যবহার করতে পারবেন!


0

এখনই আমি System.Data.SQlite নুগেট প্যাকেজ (সংস্করণ 1.0.109.2) ব্যবহার করে বিকাশ করছি। যা এসকিউএলাইট সংস্করণ 3.24.0 ব্যবহার করে।

এবং এটি আমার পক্ষে কাজ করে।

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

ডেটটাইম () ফাংশনটি ব্যবহার করতে আমি নেট করি না। সম্ভবত তারা ইতিমধ্যে S এসকিউএল সংস্করণে এসকিউএল কোয়েরি আপডেট করেছে।

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