Dữ liệu Date/ Time trong Qlik (P2)

Ở bài viết trước Dữ liệu Date/ Time trong Qlik (P1), mình đã trình bày cách thức Qlik lưu trữ dữ liệu kiểu ngày tháng và một số thủ thuật khi làm việc với kiểu dữ liệu này trong Qlik. Bài viết này tiếp tục trình bày một số thủ thuật khác.

3. Sử dụng ký tự phân chia ngày tháng

Trong phần lớn trường hợp, rất dễ nhận ra các date/time field bị nhận dạng sai từ data source theo các dấu hiệu sau:

  • Khi hiển thị dữ liệu trong bảng, các date hợp lệ (có giá trị tính toán) nằm về bên phải, trong khi các date lỗi (không có giá trị tính toán) nằm về bên trái cột.
  • Tính toán trên 1 date field chứa giá trị lỗi trả về kết quả NULL.

Tuy nhiên, khi format ngày tháng không sử dụng ký tự phân chia, sẽ khó phân biệt được một chuỗi số (ví dụ 20171223) chỉ là một số bình thường, hay là giá trị hiển thị ngày tháng. Trong bảng dưới đây, các date fields đều có vẻ hợp lệ (nằm về bên phải, expression Date2 – Date1 không trả về NULL). Tuy nhiên, Date2 – Date1 lại trả về một con số lớn bất thường, trong khi khoảng cách đúng giữa Date1 và Date2 chỉ là 2 ngày.

Khi dùng hàm Num() trên 2 field, có thể thấy Date2 thực chất là integer chứ không phải date. Lỗi này sẽ dễ phát hiện hơn khi dùng ký tự phân chia ngày tháng cho các date field. Vì phần lớn các dashboard đều phân tích dữ liệu cho một vài năm hiện tại, một quy tắc chung cho kiểm tra dữ liệu sau khi reload là đảm bảo numeric value của các date/ time field rơi vào khoảng 40000

4. Dùng hàm MakeDate

Nếu dữ liệu ngày tháng được lưu thành nhiều cột (ví dụ Day – Month – Year) trong data source, bạn có thể combine thành 1 date field duy nhất bằng hàm MakeDate(Year, Month, Day) as Date

5. Làm tròn ngày tháng

Nguồn dữ liệu của bạn có thể lưu trữ một date filed dưới dạng timestamp (không chỉ có ngày tháng, mà còn bao gồm giờ, phút, giây trong ngày). Trong rất nhiều trường hợp, bạn không cần phân tích dữ liệu chính xác đến giờ phút. Ví dụ báo cáo giao hàng theo ngày: Nếu sử dụng timestamp như một dimension, bạn sẽ có quá nhiều dimension value tương ứng với mỗi lần giao hàng, trong khi thông tin bạn quan tâm là số lượng hàng giao được trong từng ngày cụ thể.

Vấn đề sẽ còn lớn hơn khi bạn sử dụng date filed làm field liên kết giữa 2 bảng. Như trong hình minh họa dưới đây: 2 bảng ShipmentDesc và ShipmentAmount liên kết với nhau bằng field chung ShipmentDate. Ở hình bên trái, giá trị của 2 field này trông có vẻ hoàn toàn giống nhau. Tuy nhiên khi đặt các field của 2 bảng này vào cùng 1 bảng (hình bên phải), số dòng lại bị gấp đôi lên và có rất nhiều giá trị NULL trong bảng.

Nguyên nhân đươc làm rõ khi trình bày filed ShipmentDate theo định dạng timestamp: Bảng ShipmentDesc chỉ lưu ngày tháng, trong khi bảng ShipmentAmount có thêm cả giờ phút giây. Sự khác biệt này làm mất liên kết giữa 2 bảng, tương tự như khi join 2 bảng trong câu lệnh SQL khi 2 bảng đó không có giá trị nào chung.

Trong trường hợp này, dùng hàm Date() với format string bỏ đi phần giờ phút là không đủ. Nếu bạn có ShipmentDate = 17/12/2017 12:00:00 AM, biểu thức Date(ShipmentDate, ‘YYYY-MM-DD’) chỉ đảm bảo Qlik Sense hiển thị đúng format 2017-12-17, trong khi giá trị tính toán thực tế vẫn là 43086.5. Thay vào đó, bạn cần sử dụng hàm Floor() để loại bỏ phần thập phân 0.5 khỏi ShipmentDate:

Date(Floor(ShipmentDate, ‘YYYY-MM-DD’) as ShipmentDate

Hoặc cũng có thể bạn có 1 field dạng timestamp, nhưng muốn tách làm 2 filed ngày tháng và giờ phút riêng để dùng trong 2 filter khác nhau. Trong trường hợp đó, bạn có thể dùng hàm Frac() để tách phần thập phân tương ứng với phần giờ phút:

Time(Frac(ShipmentDate)) as ShipmentTime

Nguồn: https://vietqlikies.wordpress.com