PDA

View Full Version : پیدا کردن تمام رکوردها در بین دو تاریخ با linq یا کوئری در سی شارپ



سیدسبحان
دوشنبه 08 شهریور 1395, 17:29 عصر
سلام
وقت همگی بخیر
راستش من هرچی گشتم، چیز بدرد بخوری ندیدم. میدونم شاید خیلی تکراری باشه، ولی نتونستم جوابم رو پیدا کنم

من در sql server 2008 ، تاریخ های شمسی رو به Date ذخیره میکنم. مشکلی نداره. ذخیره میشه
فقط نمیدونم چطوری باید از سمت برنامه، فراخوانی کنم. از کاربر به صورت رشته میگیرم .

12457812
سه شنبه 09 شهریور 1395, 12:14 عصر
خوب چرا به صورت data ثبت میکنید؟
به صورت nvarchar ثبت کنید مشکلی هم نداره من خودم از این روش استفاده میکنم
یا اصلا بیا از کامبو باکس استفاده کن و بعد کامبو رو بریز تو تکست باکس تاریخ

barnamenevisjavan
سه شنبه 09 شهریور 1395, 13:34 عصر
سلام من برای این کار از استور پروسیجرها استفاده میکنم خیلی هم ساده هستش

ALTER PROCEDURE [dbo].[FilterSchoolByYear]

@Date1 NVARCHAR(10),
@Date2 NVARCHAR(10)


AS
BEGIN
SELECT * FROM School


WHERE (SchoolYear >= @Date1)
AND
(SchoolYear <= @Date2)


ORDER BY SchoolYear DESC,SchoolId DESC
END




شرط رو ببینی متوجه میشی که اطلاعات بین 2 تاریخ چطوری بدست میاد.درضمن بهتره فیلد تاریخ رو از نوع nvarchar و طول 10 کاراکتر درنظر بگیری و تاریخ هارو بفرمت 1395/01/10 ذخیره کنی ینی اینجوری yyyy/mm/dd

سیدسبحان
سه شنبه 09 شهریور 1395, 18:13 عصر
سلام من برای این کار از استور پروسیجرها استفاده میکنم خیلی هم ساده هستش

ALTER PROCEDURE [dbo].[FilterSchoolByYear]

@Date1 NVARCHAR(10),
@Date2 NVARCHAR(10)


AS
BEGIN
SELECT * FROM School


WHERE (SchoolYear >= @Date1)
AND
(SchoolYear <= @Date2)


ORDER BY SchoolYear DESC,SchoolId DESC
END




شرط رو ببینی متوجه میشی که اطلاعات بین 2 تاریخ چطوری بدست میاد.درضمن بهتره فیلد تاریخ رو از نوع nvarchar و طول 10 کاراکتر درنظر بگیری و تاریخ هارو بفرمت 1395/01/10 ذخیره کنی ینی اینجوری yyyy/mm/dd

تشکر مهندس
نه میخام نوعشون همین date باشه
حالا من میخام ذخیره کنم، پروسیجر رو ارور میده:

-- ================================================-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
Alter PROCEDURE [dbo].[FilterPeopleBetweenDate]

@Date1 Date,
@Date2 Date


AS
BEGIN
SELECT * FROM dbo.ViewPeople


WHERE (Date_Sabt >= @Date1)
AND
(Date_Sabt <= @Date2)


ORDER BY Date_Sabt DESC,ID DESC
END
GO

متن ارور:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Alter'.
کجاش اشتباست؟

barnamenevisjavan
سه شنبه 09 شهریور 1395, 19:30 عصر
تشکر مهندس
نه میخام نوعشون همین date باشه
حالا من میخام ذخیره کنم، پروسیجر رو ارور میده:

-- ================================================-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
Alter PROCEDURE [dbo].[FilterPeopleBetweenDate]

@Date1 Date,
@Date2 Date


AS
BEGIN
SELECT * FROM dbo.ViewPeople


WHERE (Date_Sabt >= @Date1)
AND
(Date_Sabt <= @Date2)


ORDER BY Date_Sabt DESC,ID DESC
END
GO

متن ارور:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Alter'.
کجاش اشتباست؟
Alter رو به CREATE تغییر بدید التر برای ویرایش هستش

mrprestige
سه شنبه 09 شهریور 1395, 19:38 عصر
سلام دوست من وقتت بخیر ،

Query :

SqlDbCommand command = new SqlDbCommand(
"SELECT * FROM نام جدول Datecolumn between @DateStart AND @DateEnd");
command.Parameters.AddWithValue("@DateStart",textbox1.text);
command.Parameters.AddWithValue("@DateEnd" ,textbox2.text);


LINQ :


var Tarikh = from a in Tablename where ( a.Start.Date >= startDate.Date && a.Start.Date <= endDate );

پیروز و موفق باشید

سیدسبحان
چهارشنبه 10 شهریور 1395, 10:34 صبح
سلام دوست من وقتت بخیر ،

LINQ :


var Tarikh = from a in Tablename where ( a.Start.Date >= startDate.Date && a.Start.Date <= endDate );

پیروز و موفق باشید

تشکر برادر
مشکل اینجاست که من تاریخ رو به صورت رشته از کاربر میگیرم
بعد وقتی میخام به تاریخ تبدیلش کنم، خطا میده. بنظرم چون وقتی تبدیل میکنه به datetime ساعت هم بهش اضاف میکنه. یعنی فقط به قسمت تاریخش نیاز دارم.
چیزی که از سایتهای خارجی فهمیدم این هست که :


Convert.ToDateTime(fromDate).Date
ولی وقتی دیباگ میکنم بازم خطا میده و میفهمم که این کد بازم ساعت رو باهاش برمیگردونه.
نمیدونم چطوری فقط قسمت تاریخ رو بدست بیارم؟!:متفکر:

سیدسبحان
چهارشنبه 10 شهریور 1395, 10:35 صبح
Alter رو به CREATE تغییر بدید التر برای ویرایش هستش
تشکر این درست شد ولی نمیدونم چطوری داخل دیتاگرید نشونش بدم؟!:متفکر:

mr.sirwan
چهارشنبه 10 شهریور 1395, 12:37 عصر
تشکر برادر
مشکل اینجاست که من تاریخ رو به صورت رشته از کاربر میگیرم
بعد وقتی میخام به تاریخ تبدیلش کنم، خطا میده. بنظرم چون وقتی تبدیل میکنه به datetime ساعت هم بهش اضاف میکنه. یعنی فقط به قسمت تاریخش نیاز دارم.
چیزی که از سایتهای خارجی فهمیدم این هست که :


Convert.ToDateTime(fromDate).Date
ولی وقتی دیباگ میکنم بازم خطا میده و میفهمم که این کد بازم ساعت رو باهاش برمیگردونه.
نمیدونم چطوری فقط قسمت تاریخ رو بدست بیارم؟!:متفکر:

دوست عزیز اگه تاریخ رو بصورت رشته ذخیره کرده باشی، لازم نیس به DateTime تبدیلش کنی، فقط نیاز هست که دوتا رشته رو باهم مقایسه کنی

به این روش میتونین دوتا string رو باهم مقایسه کنین:


strvar1.CompareTo(strvar2)

این دستور اگر strvar1 کوچکتر از strvar2 باشه مقدار -1، درصورت برابر بودن، مقدار 0 و درصورتی که strvar1 از strvar2 بزرگتر باشه مقدار 1 رو برمیگردونه

حالا شما داخل کوئری Linq بدین صورت عمل کن:


var Result = from a in Tablename where( a.Date.CompareTo(txtFromDate.Tex) >= 0 && a.Date.CompareTo(txtToDate.Text) <= 0 );





موفق باشی

Mahmoud.Afrad
چهارشنبه 10 شهریور 1395, 15:01 عصر
تشکر برادر
مشکل اینجاست که من تاریخ رو به صورت رشته از کاربر میگیرم
بعد وقتی میخام به تاریخ تبدیلش کنم، خطا میده. بنظرم چون وقتی تبدیل میکنه به datetime ساعت هم بهش اضاف میکنه. یعنی فقط به قسمت تاریخش نیاز دارم.
چیزی که از سایتهای خارجی فهمیدم این هست که :


Convert.ToDateTime(fromDate).Date
ولی وقتی دیباگ میکنم بازم خطا میده و میفهمم که این کد بازم ساعت رو باهاش برمیگردونه.
نمیدونم چطوری فقط قسمت تاریخ رو بدست بیارم؟!:متفکر:

مشکل ساعت نیست، اصلا ساعت در این کد ایجاد خطا نخواهد کرد و نهایتا نتیجه مورد نظر رو به شما نخواهد داد.
توصیه میکنم کدی که نوشتید رو همراه متن خطا قرار بدید.
و نکته دیگه اینکه تاریخ شمسی باید به میلادی تبدیل بشه و در دیتابیس ذخیره و برای جستجو استفاده بشه.

barnamenevisjavan
چهارشنبه 10 شهریور 1395, 16:40 عصر
تشکر این درست شد ولی نمیدونم چطوری داخل دیتاگرید نشونش بدم؟!:متفکر:
خوب کاری نداره که یه بایندینگ سورس بنداز رو فرم و وصلش کن به به جدول مربوطه و گرید رو وصل کن به بایندینگ سورس درنهایت دیتاسورس بایندینگ سورس رو وصل کن به پروسیجر:لبخند: