三月四日還是四月三日。這個問題聽起來很小,但我們看過一份跨國時程表因此差了一個月。日期欄位的錯,多半不是打錯字,是對日期這種資料有幾個根深蒂固的誤判。以下一個一個盤點。
日期一律用四位數年、兩位數月、兩位數日的順序記錄,並確認儲存格是真正的日期值而不是文字。跨時區的時間要選定一個基準時區,寫在表頭。一個欄位只裝一種意義的日期,事件發生日、登錄日與修改日分開存。做到這三點,日期欄位的錯誤就能擋掉大半。
日期戳記,是附在一筆資料上、說明某件事在何時發生的時間標記。以下八個誤判,是我們在客戶的試算表裡反覆看到的。每一個都附上辨認方法與修正做法。
同一串數字,有的地區先寫月再寫日,有的地區先寫日再寫月。跨國合作時,一方輸入的日期,另一方可能讀成另一天。日期數字在十二以內時,兩種讀法都合法,錯了也不會跳出警告。
修正做法是改用由大到小的寫法,年在前,月居中,日在後。這種順序沒有第二種讀法。規則寫進表頭,並在第一列放一個範例。
從其他系統複製貼上的日期,常常是文字。它長得一模一樣,但不能排序、不能相減、不能依月份分組。
辨認方法有兩個。看儲存格的預設對齊,文字通常靠左,數值與日期通常靠右。或用檢查是否為數值的函式測試。修正時,另開一欄用轉換函式把文字轉成日期值,核對無誤後,再取代原欄。不要直接在原欄上改。
兩位數年份,軟體會自己猜是哪個世紀。猜的規則在不同工具之間不一致。記錄出生年、建物完工年、合約到期年的時候,這個猜測可能差一百年。
另外,台灣常用的民國紀年,軟體多半不認得,會被當成文字或被讀成西元的很早期年份。對內文件要用民國年可以,但資料欄位請存西元,顯示需求另外處理。
一位同事在台北下午三點更新了報價,另一位在歐洲的同事看到下午三點,以為是幾分鐘前的事。實際上差了好幾個小時。
時區,是地球上採用同一標準時間的區域。只要團隊或客戶跨了時區,時間欄位就要有時區資訊。最省事的做法是全表統一用一個基準時區,例如總部所在地的時間,或世界協調時間,並在表頭寫明。需要當地時間時,另加一欄時區代碼。
有日光節約時間的地區,一年裡與台灣的時差會改變。排定跨國會議或截止時間時,要另外確認當天的實際時差。
表上只有一欄日期。有人填的是事情發生的日子,有人填的是自己登錄的日子。兩者可能差好幾天。
至少要分三種。事件日期,是事情在現實中發生的那一天。登錄日期,是這筆資料被寫進表的那一天。修改日期,是這筆資料最後一次被改動的那一天。三欄各自獨立。分析成交週期用事件日期。稽核資料品質用登錄日期與事件日期的差距,差距越大,代表補登越多。
有些人在登錄日期欄放一個回傳今天日期的函式。當天看是對的。隔天打開,整欄都變成隔天的日期。
這類函式每次開檔都會重算,不能當作戳記。登錄日期要存成固定值。可以用鍵盤快速鍵輸入當天日期,或是輸入後把公式貼成數值。這個錯誤在交接時最常被發現,那時整欄歷史已經沒了。
把三月一日到三月十五日寫在同一個儲存格,對人來說很清楚,對試算表來說是一串文字。之後想找出某一天有哪些項目在進行中,做不到。
期間一律拆成開始日期與結束日期兩欄。只有單日的事件,兩欄填同一天。尚未結束的,結束日期留空,並在資料字典寫明空白代表進行中。
檔名寫著某一天,裡面的資料卻是抓到前一週為止。檔名的日期通常是存檔的日子,不是資料涵蓋的日子。
在表的第一頁固定寫三行:資料涵蓋期間、資料擷取時間與時區、製表人。這三行比檔名可靠。引用公開統計資料時尤其重要,因為公開資料會回溯修正,同一個期間在不同日期擷取,數字可能不同。
這五項檢查用篩選與條件式格式就能做,大約十五分鐘。第一項最有效。年份打錯的資料,一排序就浮到最上面或最下面。
一個同時與台灣和海外團隊合作的專案,共用一張時程表。海外同事習慣先寫日再寫月,台灣同事習慣先寫月再寫日。表上沒有規定格式,試算表的地區設定跟著各自的帳號走。
其中一項交付的截止日,被輸入成一串數字,在一方的畫面上是某月的三日,在另一方的理解裡是三月的某日。兩邊各自照自己的理解排工作。直到其中一方開始催件,才發現兩邊認知的日期差了將近一個月。
事後的修正有三項。把檔案的地區設定固定為同一個,不再跟著個人帳號。所有日期欄改成年月日由大到小的顯示格式。重要的截止日,旁邊加一欄用文字寫出星期幾。星期幾是一個很便宜的檢查碼,日期被讀錯時,星期通常對不上,馬上會有人發現。
日期欄的錯誤,多數是在匯入那一刻進來的。從表單工具、客戶提供的檔案或其他軟體匯出的資料,各有各的日期寫法。匯入後照下面的順序檢查,可以在問題擴散之前攔下來。
第二步是關鍵。如果來源資料裡剛好所有日期的日與月都在十二以內,光看資料無法判斷順序,必須回頭問提供資料的人,或查來源系統的設定。不要猜。
寫在獨立的規範文件裡,沒有人會看。有效的位置有三個。欄位標題的註解,寫一行格式與一個範例。資料驗證,直接擋掉不是日期的輸入,並在錯誤訊息裡寫出正確格式。表頭固定一列,寫明時區與資料涵蓋期間。
規則嵌在填寫的動線上,填的人不需要記住它,照著錯誤訊息改就會填對。這比任何教育訓練有效。
合約、發票、法律文件上的日期寫法,要依文件適用地的慣例與規定,不能為了資料整齊就自行改寫。這類文件的日期效力與格式要求,應交由當地持牌專業人士確認。資料表裡可以另存一欄標準化的日期,原文件照原樣保留。
需要精確到秒、而且要比對多個系統紀錄的情境,例如追查網站異常,試算表的手動戳記不夠用,應該直接使用系統產生的日誌時間。
只有單一地區、單一使用者、不會交接的個人紀錄,也不必做到時區與三種日期分欄。規則的成本要與出錯的代價相稱。