是這樣的我想做一個查詢功能,查詢這個日期到這個日期裡的所有資料,格式是用
民國,例如我想查107/11/11~107/12/10間的資料,可是我想查12/10號的資料時
12月/10號的資料就直接消失,請問這是什麼原因?
controller:
public ActionResult HDNurseRecordList(HDNurseRecordQueryViewModel model)
{
if (!String.IsNullOrWhiteSpace(model.EndDateString))
{
model.EndDate = DateHelper.ToDate(model.EndDateString);
}
if (!String.IsNullOrWhiteSpace(model.StartDateString))
{
model.StartDate = DateHelper.ToDate(model.StartDateString);
}
PatInfoSession pat = SessionPatInfo();
HDNurseRecordService hdn = new HDNurseRecordService();
model.HDNurseRecords = hdn.FindNRecId(pat.PatGuid, model.StartDate, model.EndDate);
if (model.HDNurseRecords == null) model.HDNurseRecords = new List<HDNurseRecordListDto>();
model.StartDateString = DateHelper.ToDate(model.StartDate);
model.EndDateString = DateHelper.ToDate(model.EndDate);
return View(model);
}
ToDate方法:
public static DateTime ToDate(string dt)
{
if (String.IsNullOrWhiteSpace(dt)) return new DateTime(1900, 1, 1);
string[] dts = dt.Split('/');
if (dts.Length < 3) return new DateTime(1900, 1, 1);
int year = Int32.Parse(dts[0]) + 1911;
int mon = Int32.Parse(dts[1]);
int day = Int32.Parse(dts[2]);
return new DateTime(year, mon, day, 0, 0, 0);
}
public static string ToDate(DateTime dt)
{
if (IsDefaultDate(dt)) return "";
if (dt == null || dt.Year == 1) return "";
string dateStr = dt.ToString("/MM/dd");
string year = (dt.Year - 1911).ToString();
return year + dateStr;
//return dt.ToString("yyyy/MM/dd");
}
service層:
public List<HDNurseRecordListDto> FindNRecId(string pat_guid, DateTime StartDate, DateTime EndDate)
{
if (String.IsNullOrWhiteSpace(pat_guid)) return null;
List<HDNurseRecordListDto> dtos = (from x in _repo.HD_NURSE_RECORD
where
pat_guid == x.PAT_GUID && x.RECORD_DATETIME >= StartDate && x.RECORD_DATETIME <= EndDate
select new HDNurseRecordListDto
{
RECORD_DATETIME = x.RECORD_DATETIME,
NURSE_EMP_ID = x.NURSE_EMP_ID,
CID = x.CID,
CONTENT = x.CONTENT,
CRE_UID = x.CRE_UID,
GUID = x.GUID,
MOD_UID = x.MOD_UID,
PAT_GUID = x.PAT_GUID
}).OrderByDescending(x=>x.RECORD_DATETIME).ToList<HDNurseRecordListDto>();
foreach (HDNurseRecordListDto dto in dtos)
{
dto.Name = _repo.EMPLOYEE.Where(x => x.CID == dto.CID && x.EMP_ID == dto.NURSE_EMP_ID).FirstOrDefault<EMPLOYEE>().EMP_NAME;
}
return dtos;
}
view model裡我是給這樣的值
StartDate = DateTime.Now.AddDays(-30);
EndDate = DateTime.Now;
還請各位告訴我原因及解法,謝謝
如果你是真的用日期來存的話,
可能的原因,
你要從開始日期的 00:00:00 查詢到結束日期的 23:59:59
我是都這樣子做的,
要不然結束日期的那天的資料會消失.
你好,我後來是在我的service層加上這行
EndDate = new DateTime(EndDate.Year, EndDate.Month, EndDate.Day, 0, 0, 0).AddDays(1);
這樣我要的功能就可以正常執行,只是不知道為什麼要這樣做,
然後時間日期經過我的那個todate方法後都會變成12:00:00AM
你這樣只是把日期往後加了一天啊....
但就很奇怪,不加這行查當日日期,當日日期就直接消失@@
一點也不奇怪,
2018/12/11 23:59:59 跟 2018/12/12 00:00:00 只差一秒,
其實我有想過這也是一種解法,
不過你要小心,
如果要加一天要用 < 不能用 <= ,
否則有可能遇到 2018/12/12 00:00:00的也被抓進來.
能否請問這是什麼解法?我比較好奇怎麼會是這種結果?
因為我之前有做過類似的功能,只是下面不用顯示時間,而現在
顯示時間卻需要加這行才能解決,我最無法理解就是傳進去的時
間上面是寫著12:00:00AM,我的資料裡的時間明明都小於他,但為什麼卻還是消失?
不會奇怪啊,
你覺得奇怪才讓我覺得奇怪 XD,
因為通常我們時間寫進去不是剛好0分0秒啊,
除非你有特別處理過保證它是 00:00:00,
如果是抓DateTime.Now之類的,
或是用SQL抓現在時間,
後面會帶 時分秒,
如果你用小於等於 2018/12/11 00:00:00 的方式,
那 2108/12/11 00:00:01之後的 就不會被抓到,
那當然就不是我們要的結果了啊 XD
1.不管你用日期查、還是時間查,程式都會把他轉成時間。
2.假設我只要查 2018/12/11 這天好了,程式會把他轉為 2018/12/11 00:00:00,然後開始和結束都是這天的話,開始和結束日期,程式都會把他當成11日零時。
3.這樣的話,當然查不到11日這天的資料。
解法其實你也已經寫出來了,就是結束日期+1天,就這麼簡單。
我懂了,感謝您的解說,花了一些時間才懂@@
所以查詢 2018/12/11的資料
實際準確範圍時間應該是
StartDate :2018/12/11 00:00:00
EndDate :2018/12/12 00:00:00
而EndDate 必須用<
若用<= 則會把2018/12/22 00:00:00的資料帶入
你程式中搜尋資料的條件
不只有「日期」
還有許多其他條件
要找出原因
提供一個老方法
這個老方法適用於你這隻程式和所有SQL查詢的程式
先在資料庫直接下SQL指令
確認
用107/11/11-107/12/10
和107/12/10查詢
都能查出你要的資料
再把這段SQL指令
「轉換」到你的 service 層