View Full Version : جستجو بین 2 تاریخ و ساعت
orasion
یک شنبه 08 مرداد 1396, 10:44 صبح
سلام دوستان، روی بانک من تاریخ و ساعت با نوع varchar تعریف شدن به این صورت '1396/05/01' و ساعت هم ورکر 5 تایی بصورت '00:00'. مشکلی که دارم در واقع مربوط میشه به بدست آوردن حد فاصل بین دو تاریخ و ساعت بصورت پیوسته.
مثلا وقتی میخوام پرسنلی که بین ساعت 08:00 صبح تاریخ 1396/05/01 تا ساعت 12:00 تاریخ 1396/05/03 وارد شدن رو بدست بیارم از این شرط
(Person.InDate >= '1396/05/01' AND Person.InTime >= '08:00') AND (Person.InDate <= '1396/05/03' AND Person.InTime <= '09:00')
استفاده میکنم. مشکلم اینجاست که این شرط حد فاصل این دو ساعت رو بصورت پیوسته نشون نمیده بلکه نتیجش پرسنلیه که در هر روز یعنی 05/01 و 05/02 و 05/03 بین ساعت 8 الی 9 اومدن. همانند شیفت ساعتی، و اگر پرسنلی ساعت 15:00 تاریخ 05/01 وارد شده باشه در نتیجه لحاظ نمیشه. من حتی از between هم استفاده کردم باز درست نشد. ممنون میشم راهنمایی کنید.
رامین مرادی
یک شنبه 08 مرداد 1396, 11:56 صبح
شما تاریخهاتون رو تبدیل به میلادی کنید و با between رکوردهایی که بین دو تاریخ هستند رو پیدا کنید(در صورت استفاده از تاریخ شمسی ممکنه در تاریخ مثلا 2/29 به خطا بر بخورید. بنا به تجربه میگم). بعد ساعتها رو مقایسه کنید. اینجوری به نظرم راحت تر میتونید مشکل رو حل کنید.
SELECT [id],[Name],[InDate],[InTime] FROM [test]
where [InDate] Between '2017/01/01' AND '2017/01/05'
AND [InTime]>='08:00' AND [InTime]<='09:00'
orasion
یک شنبه 08 مرداد 1396, 13:13 عصر
متاسفانه با این نگارش باز هم جواب همونه، در واقع نتیجه با تاریخ شمسی و یا تبدیل شده اون به میلادی یکسانه ولی بمجرد اضافه شدن شرط ساعت (در هر دو حالت، چه در کنار تاریخ و یا خارج از شرط تاریخ)، تمام رکورد هایی که در شرط ساعت نمی گنجن رو حذف میکنه بدون توجه به تاریخ!
orasion
یک شنبه 08 مرداد 1396, 13:29 عصر
البته اگر فیلد تاریخ و ساعت رو با هم Concat کنیم و در یک فیلد سوم قرار بدیم (همانند مثال) مشکل حل میشه:
[Person.InDate_Conc]
BETWEEN '1396/05/01 08:00' AND '1396/05/03 09:00'
ولی اگر فیلدهای تاریخ و ساعت جدا باشند چطور؟
orasion
یک شنبه 08 مرداد 1396, 13:53 عصر
درست شد. شکل نگارش شرط رو اینطور تغییر دادم و جواب داد. در واقع هر دو فیلد تاریخ و ساعت رو توی عبارت Where بهم وصل کردم بدون اینکه از قبل در یک فیلد سوم بریزمشون و یک تاریخ و ساعت یکپارچه ایجاد کردم.
'Person.InDate+ ' ' +Person.InTime BETWEEN '1396/05/01 08:00' AND '1396/05/03 09:00
Mahmoud.Afrad
یک شنبه 08 مرداد 1396, 14:00 عصر
از نوع DateTime2 استفاده کنید که در یک ستون تاریخ و زمان رو بتونید ذخیره کنید. فقط باید به صورت میلادی ذخیره کنید.
اگر هم میخواهید دو ستون جدا باشند از نوع Date و Time استفاده کنید.
رامین مرادی
دوشنبه 09 مرداد 1396, 08:12 صبح
شما تاریخهاتون رو تبدیل به میلادی کنید و با between رکوردهایی که بین دو تاریخ هستند رو پیدا کنید(در صورت استفاده از تاریخ شمسی ممکنه در تاریخ مثلا 2/29 به خطا بر بخورید. بنا به تجربه میگم). بعد ساعتها رو مقایسه کنید. اینجوری به نظرم راحت تر میتونید مشکل رو حل کنید.
SELECT [id],[Name],[InDate],[InTime] FROM [test]
where [InDate] Between '2017/01/01' AND '2017/01/05'
AND [InTime]>='08:00' AND [InTime]<='09:00'
من با این دستور جواب صحیح گرفتم :متفکر:. میاد بین اون دو تاریخ رو انتخاب میکنه . بعد بین اون دو ساعت. که بایدم اینجور باشه. شما گفتید بین این دو تاریخ و بین این دو ساعت. باسد هر دو شرط اعمال بشه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.