iT邦幫忙

0

以日期做查詢功能請教

是這樣的我想做一個查詢功能,查詢這個日期到這個日期裡的所有資料,格式是用
民國,例如我想查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;

還請各位告訴我原因及解法,謝謝

小魚 iT邦高手 1 級 ‧ 2018-12-11 12:16:51 檢舉
 
優悠 iT邦新手 4 級 ‧ 2018-12-25 11:12:47 檢舉
EndDate = DateTime.Now.AddDays(1).AddSeconds(-1);

2 個回答

1
小魚
iT邦高手 1 級 ‧ 2018-12-11 12:18:30
最佳解答

如果你是真的用日期來存的話,
可能的原因,
你要從開始日期的 00:00:00 查詢到結束日期的 23:59:59
我是都這樣子做的,
要不然結束日期的那天的資料會消失.

看更多先前的回應...收起先前的回應...
tenno081 iT邦新手 5 級 ‧ 2018-12-11 13:08:53 檢舉

你好,我後來是在我的service層加上這行

 EndDate = new DateTime(EndDate.Year, EndDate.Month, EndDate.Day, 0, 0, 0).AddDays(1);

這樣我要的功能就可以正常執行,只是不知道為什麼要這樣做,
然後時間日期經過我的那個todate方法後都會變成12:00:00AM

Homura iT邦研究生 1 級 ‧ 2018-12-11 13:39:17 檢舉

你這樣只是把日期往後加了一天啊....

tenno081 iT邦新手 5 級 ‧ 2018-12-11 13:49:26 檢舉

但就很奇怪,不加這行查當日日期,當日日期就直接消失@@

小魚 iT邦高手 1 級 ‧ 2018-12-11 14:12:38 檢舉

一點也不奇怪,
2018/12/11 23:59:59 跟 2018/12/12 00:00:00 只差一秒,
其實我有想過這也是一種解法,
不過你要小心,
如果要加一天要用 < 不能用 <= ,
否則有可能遇到 2018/12/12 00:00:00的也被抓進來.

tenno081 iT邦新手 5 級 ‧ 2018-12-11 14:13:55 檢舉

能否請問這是什麼解法?我比較好奇怎麼會是這種結果?
因為我之前有做過類似的功能,只是下面不用顯示時間,而現在
顯示時間卻需要加這行才能解決,我最無法理解就是傳進去的時
間上面是寫著12:00:00AM,我的資料裡的時間明明都小於他,但為什麼卻還是消失?

小魚 iT邦高手 1 級 ‧ 2018-12-11 14:18:16 檢舉

不會奇怪啊,
你覺得奇怪才讓我覺得奇怪 XD,
因為通常我們時間寫進去不是剛好0分0秒啊,
除非你有特別處理過保證它是 00:00:00,
如果是抓DateTime.Now之類的,
或是用SQL抓現在時間,
後面會帶 時分秒,
如果你用小於等於 2018/12/11 00:00:00 的方式,
那 2108/12/11 00:00:01之後的 就不會被抓到,
那當然就不是我們要的結果了啊 XD

froce iT邦高手 1 級 ‧ 2018-12-11 14:29:08 檢舉

1.不管你用日期查、還是時間查,程式都會把他轉成時間。
2.假設我只要查 2018/12/11 這天好了,程式會把他轉為 2018/12/11 00:00:00,然後開始和結束都是這天的話,開始和結束日期,程式都會把他當成11日零時。
3.這樣的話,當然查不到11日這天的資料。

解法其實你也已經寫出來了,就是結束日期+1天,就這麼簡單。

tenno081 iT邦新手 5 級 ‧ 2018-12-11 14:40:46 檢舉

我懂了,感謝您的解說,花了一些時間才懂@@

kk9013203 iT邦新手 5 級 ‧ 2018-12-13 10:19:53 檢舉

所以查詢 2018/12/11的資料
實際準確範圍時間應該是
StartDate :2018/12/11 00:00:00
EndDate :2018/12/12 00:00:00
而EndDate 必須用<
若用<= 則會把2018/12/22 00:00:00的資料帶入

0
海綿寶寶
iT邦超人 1 級 ‧ 2018-12-11 11:39:44

你程式中搜尋資料的條件
不只有「日期」
還有許多其他條件

要找出原因
提供一個老方法
這個老方法適用於你這隻程式和所有SQL查詢的程式

先在資料庫直接下SQL指令
確認
用107/11/11-107/12/10
和107/12/10查詢
都能查出你要的資料

再把這段SQL指令
「轉換」到你的 service 層

我要發表回答

立即登入回答