PDA

View Full Version : سوال: کوئری گرفتن از یک محدوده تاریخ معین



ricky22
سه شنبه 13 بهمن 1388, 11:41 صبح
سلام من چطوری می تونم قسمت where رو جوری بنویسم که از یک تاریخ معین در جدول کوئری بگیریم؟
ساختار بانک رو این طوری تصور کنید
http://barnamenevis.org/forum/attachment.php?attachmentid=43472&stc=1&d=1265180685
مثلا از ماه فروردین تا اسفند
مرسی

iranrose63
سه شنبه 13 بهمن 1388, 11:51 صبح
اگه تاريخ از نوع varchar است


select ame from tabel where start between '1388/01/01' and '1388/12/29'

ricky22
سه شنبه 13 بهمن 1388, 12:01 عصر
اگه تاریخ از نوع varchar است
مرسی دوست خوب اگه از نوع date بود چی؟

A.Farzin
سه شنبه 13 بهمن 1388, 12:08 عصر
بستگی به data type فیلد start دارد.
اگر این فیلد از نوع char، varchar و امثالهم باشد

SELECT * FROM MyTable WHERE Start Like '1388/[0-9][0-9]/[0-9][0-9]'
یا

SELECT * FROM MyTable
WHERE CAST(REPLACE(Start, '/', '') AS bigint) BETWEEN 13880101 AND 13881230
اگه از نوع datetime بود و شما از تابعی برای نمایش شکل هجری شمسی استفاده می‌کنید، لازم است تابع دیگری برای تبدیل شمسی به میلادی داشته ولی در این حالت شما از BETWEEN می‌توانید استفاده کنید فقط به جای CAST کردن فیلد باید دو تاریخ را به نوع datetime تبدیل (CAST) کنید.

iranrose63
سه شنبه 13 بهمن 1388, 12:38 عصر
مرسی دوست خوب اگه از نوع date بود چی؟
هميشه ميتوني از between استفاده كني فقط اگه نوع فيلدت datetime باشه تاريخت نميتونه قبل از سال 1753 باشه

ricky22
سه شنبه 13 بهمن 1388, 12:42 عصر
همیشه میتونی از between استفاده کنی فقط اگه نوع فیلدت datetime باشه تاریخت نمیتونه قبل از سال 1753 باشه
پس نوع date به درد تاریخ شمسی نمی خوره نه؟

ricky22
سه شنبه 13 بهمن 1388, 12:44 عصر
بستگی به data type فیلد start دارد.
اگر این فیلد از نوع char، varchar و امثالهم باشد

SELECT * FROM MyTable WHERE Start Like '1388/[0-9][0-9]/[0-9][0-9]'یا

SELECT * FROM MyTable
WHERE CAST(REPLACE(Start, '/', '') AS bigint) BETWEEN 13880101 AND 13881230اگه از نوع datetime بود و شما از تابعی برای نمایش شکل هجری شمسی استفاده می‌کنید، لازم است تابع دیگری برای تبدیل شمسی به میلادی داشته ولی در این حالت شما از BETWEEN می‌توانید استفاده کنید فقط به جای CAST کردن فیلد باید دو تاریخ را به نوع datetime تبدیل (CAST) کنید.
قسمت اول متوجه نشدم چطوری شما بین 2 تا تاریخ گزارش گرفتی؟

iranrose63
سه شنبه 13 بهمن 1388, 12:54 عصر
پس نوع date به درد تاریخ شمسی نمی خوره نه؟
مگه اينكه با توابعي كه خودت مينويسي تبديل بين شمسي و ميلادي انجام بدي

zoofa
سه شنبه 13 بهمن 1388, 13:47 عصر
سلام دوست عزیز

یک روشی هم که می تونید استفاده کنید و خیلی هم خوب جواب می ده نوع تاریختون رو date انتخاب کنید و تاریخ را که شمسی می گیرید به میلادی تبدیل کنید و با میلادی تو دیتابیس ذخیره کنید و هنگام نمایش نیز به شمسی تبدیل کنید و نشان دهید

در این روش می تونید بوسله between بین دو تا تاریخ میلادی رو query بگیرید که خیلی خیلی دقیق و خوب و با سرعت بالا انجام میشه

ricky22
سه شنبه 13 بهمن 1388, 14:24 عصر
سلام دوست خوب میشه یک مثال کوچیک از این نوع تابع بزنید؟

zoofa
چهارشنبه 14 بهمن 1388, 00:39 صبح
http://barnamenevis.org/forum/showpost.php?p=808710&postcount=2

دوست عزیز از لینک فوق توابع تبدیلی رو بگیرید و استفاده کنید
اگه سوالی بود در خدمتم :لبخندساده:

A.Farzin
چهارشنبه 14 بهمن 1388, 18:23 عصر
قسمت اول متوجه نشدم چطوری شما بین 2 تا تاریخ گزارش گرفتی؟
چون شما گفته بودید از فروردین تا اسفند، شرط را چنین تعیین کردم در این حالت هر روز از سال 1388 که باشد در شرط صدق می‌کند.
ولی اگر محدوده تاریخی شما شامل تمام سال نبود، دیگر این روش اول پاسخگو نیست و باید به طریقه دوم عمل کنید.