PDA

View Full Version : آموزش: ارسال مقدار DateOnly به SQL Server



mmbguide
یک شنبه 04 شهریور 1403, 11:48 صبح
سلام

من یک Entity دارم که نوع یکی از Propertyها DateTime هستش. در یکی از متدها لازم دارم تا اطلاعاتی که از بانک دریافت میشه صرفا برمبنای تاریخ باشه و ساعت در نظر گرفته نشه. برای این منظور شرط را بصورت زیر نوشتم:


x.ReceiveTime.Value.Date == model.ReceiveDate.Date

اما SQL اطلاعاتی را بر نمی گرداند. Profiler را بررسی کردم و دیدم که EF کدهای SQL را در بخش WHERE بصورت زیر تولید کرده. درحقیقت در کد زیر مقدار موجود در SQL تبدیل به تاریخ میشه و خروجی اون بدون ساعت هست و فقط تاریخ داره (2024-08-24):

CAST(date, [r].[ReceiveTime])

مقداری که برای مقایسه به SQL ارسال شده ساعت هم داره و این باعث میشد که SQL خروجی نده:

'2024-08-24 00:00:00'

در واقع مقایسه مقادیر در SQL بصورت زیر انجام میشه:

WHERE ReceiveTime = '2024-08-24 00:00:00'

در انتها شرط را در متد بصورت زیر تغییر دادم:

DateOnly.FromDateTime(x.ReceiveTime.Value) == DateOnly.FromDateTime(model.ReceiveDate)

و حالا تغییرات در سمت SQL بصورت زیر بوده. در سمت SQL خروجی مطابق کدها اولیه، همان مقدار تاریخ بدون ساعت است:

CAST([r].[ReceiveTime] AS date)

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

2024-08-24

آنچه که در انتها توسط SQL مقایسه میشه بصورت زیر است:

WHERE ReceiveTime = '2024-08-24'

shahryari
چهارشنبه 07 شهریور 1403, 15:49 عصر
سلام
برای این مورد


CAST(date, [r].[ReceiveTime])


اینو تست کنید
FORMAT(CAST(ReceiveTime as DATE),'yyyy-mm-dd')

برای این مورد هم

WHERE ReceiveTime = '2024-08-24 00:00:00'

این مورد را تست کنید:

WHERE SUBSTRING(ReceiveTime, 1, 10) = '2024-08-24'

mmbguide
پنج شنبه 08 شهریور 1403, 00:04 صبح
در مطلبی که ارسال کردم تمام تبدیلات و تولید کدها توسط EF انجام میشه. بنابراین برای حل مشکل در بخش Where از دستورات از DateOnly.FromDateTime استفاده کردم تا EF بتونه هر دو طرف شرط رو مدیریت کنه