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'
من یک 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'