Những vấn đề bất ngờ khi sử dụng Lịch tùy chỉnh trong Power BI và Fabric

10 tháng 4, 2026·5 phút đọc

Tính năng Time Intelligence dựa trên lịch trong Power BI và Fabric mang lại nhiều khả năng mới nhưng cũng tiềm ẩn những cạm bẫy khó lường. Bài viết này phân tích các vấn đề bất ngờ về dữ liệu khi xử lý năm nhuận và tính toán theo tuần, đồng thời đưa ra các giải pháp khắc phục.

Những vấn đề bất ngờ khi sử dụng Lịch tùy chỉnh trong Power BI và Fabric

Kể từ tháng 9 năm 2025, Power BI và Fabric Tabular Models đã được trang bị tính năng Time Intelligence dựa trên lịch (Calendar-based Time Intelligence). Mặc dù tính năng này mở ra nhiều khả năng thú vị, chúng ta cần cẩn trọng với những cạm bẫy tiềm ẩn của nó.

Sau giai đoạn hào hứng ban đầu với tính năng mới, tôi đã đi sâu phân tích để xem những khả năng này hoạt động như thế nào trong thực tế. Dưới đây là 4 ví dụ về các hiệu ứng thú vị mà tôi đã phát hiện, cùng với các giải pháp khắc phục khi có thể.

Cấu hình lịch trong Power BICấu hình lịch trong Power BI

Thiết lập các loại lịch

Để minh họa, tôi sử dụng hai báo cáo Power BI với hai bảng Date (Ngày tháng) khác nhau để tránh sự nhiễu loạn. Cả hai bảng Date đều có cùng nguồn dữ liệu.

Tôi đã cấu hình một lịch theo Dương lịch (Gregorian calendar) và một lịch dựa trên Tuần (Week-based calendar). Lịch theo tuần bao gồm cột YearOfWeek cho danh mục năm, dựa trên định nghĩa ISO-week (mỗi năm bắt đầu vào thứ Hai của tuần 1).

Tháng trước và độ dài tháng khác nhau

Trước hết, hãy xem xét các tháng có độ dài khác nhau. Tôi tạo hai thước đo (measure): một sử dụng logic time intelligence cổ điển và một sử dụng lịch Dương lịch mới.

Kết quả cho thấy sự khác biệt rõ rệt. Trong khi thước đo cổ điển hiển thị cùng một giá trị cho 3 ngày cuối cùng của tháng 3, kết quả cho tháng 2 lại bỏ qua những ngày cuối cùng của tháng 1. Thước đo dựa trên lịch mới hoạt động tốt hơn nhiều.

Điểm mấu chốt ở đây là tổng các hàng bằng với tổng được hiển thị trong hàng Total. Hàm DATEADD() hiện có hai tham số bổ sung ảnh hưởng đến kết quả cho các tháng có độ dài không bằng nhau. Đây là một hành vi khác biệt mà bạn cần lưu ý.

Vấn đề xảy ra với năm trước (Năm nhuận)

Đây là tình huống "lạ lùng" đầu tiên. Khi so sánh giá trị năm trước (PY) của tháng 3 năm 2022 và 2023, mọi thứ trông ổn. Tuy nhiên, khi so sánh năm 2024 (năm nhuận) với năm 2025, các giá trị PY của tháng 3 năm 2025 bị dịch chuyển đi 1 ngày.

So sánh dữ liệu năm nhuậnSo sánh dữ liệu năm nhuận

Điều này không chính xác. Hiệu ứng này quan sát được đến tháng 12, nơi DAX cộng tổng hai ngày cuối cùng. Nguyên nhân là do cách DAX tính toán kết quả dựa trên thứ bậc lịch, được gọi là "Khoảng cách từ cấp cha" (Distance from Parent).

Một giải pháp là đảm bảo tất cả các tháng có độ dài bằng nhau. Ví dụ, tạo một lịch tùy chỉnh với 31 ngày cho tất cả các tháng. Tuy nhiên, cách này yêu cầu lịch tùy chỉnh, có thể gây ra các vấn đề khác hoặc không đáp ứng được các yêu cầu cụ thể.

Một giải pháp khác là tính PY bằng cách lùi lại 12 tháng thay vì 1 năm:

Online Sales (-12 M Gregorian) =
CALCULATE([Online Sales]
,DATEADD('Gregorian Calendar', -12, MONTH)
)

Kết quả cho thấy tổng của các quý và năm là chính xác với phương pháp này.

Tính toán theo tuần gây đau đầu

Đây là một trường hợp rất kỳ lạ. Khi xem xét tính toán PY theo tuần cho năm 2023, các hàng cho năm 2023 đều giống nhau khi năm 2022 được thu gọn. Chỉ khi tôi mở rộng ít nhất một tuần của năm 2022 xuống mức Date, các giá trị đúng cho năm 2023 mới hiển thị.

Tôi đã gặp vấn đề này trước đây và giải quyết bằng cách tạo một bảng riêng cho lịch theo tuần. Nhưng lần này nó không hiệu quả. Tôi phải xây dựng lại mô hình dữ liệu từ đầu và nó hoạt động ngay lập tức.

Tính toán theo tuầnTính toán theo tuần

Tôi không chắc chắn sự khác biệt giữa hai thiết lập này là gì, vì bảng Date đến từ cùng một nguồn và lịch được định nghĩa bằng cách sử dụng cùng các cột. Tôi chỉ gặp hiệu ứng này với các tính toán theo tuần.

Kết hợp logic tuần và tháng

Một khách hàng muốn xem báo cáo kết quả hàng ngày của tháng hiện tại, so với cùng tuần và cùng ngày trong tuần của năm trước. Đây là sự kết hợp giữa lịch Dương lịch (theo tháng) với logic theo tuần.

Tuy nhiên, vì các tuần không căn chỉnh với các tháng, tôi không thể thêm danh mục Tháng. Tôi sẽ gặp lỗi khi xác thực nếu cố thêm danh mục này. Do đó, tôi không thể sử dụng tính toán MTD (Month-to-Date), vì hàm sẽ không tìm thấy danh mục cần thiết.

Tính toán theo tuần – Điểm tích cực

Để kết thúc bằng một ghi chú tích cực, tôi có thể chỉ ra một thứ hoạt động rất tốt. Hãy nhớ vấn đề với các tháng không có cùng độ dài và cách các giá trị PY bị dịch chuyển? Hiệu ứng này không xuất hiện khi thực hiện tính toán theo tuần.

Các kết quả được tính toán chính xác dựa trên tuần và các ngày trong tuần đúng. Như mong đợi, các giá trị không được ánh xạ tới ngày của năm trước mà tới các ngày trong tuần theo từng tuần. Lý do là mỗi tuần có cùng độ dài và bảng ngày được xây dựng để hỗ trợ kịch bản này.

Kết luận

Như bạn có thể thấy, kết quả là hỗn hợp. Khi xem xét kết quả từ các kỳ trước có độ dài khác nhau (tháng hoặc năm), kết quả bị dịch chuyển. Khi các kỳ có cùng độ dài (tuần hoặc lịch tùy chỉnh), mọi thứ hoạt động như mong đợi.

Tôi cực kỳ ngạc nhiên và thất vọng khi thấy kết quả cho các năm nhuận. Nhưng may mắn thay, điều này có thể được giải quyết bằng cách hiểu logic mới hoạt động như thế nào. Vấn đề khác khiến tôi lo lắng là hoạt động không nhất quán của lịch dựa trên tuần và tính toán PY. Chúng ta vẫn đang ở giai đoạn Preview, hãy cùng chờ xem tính năng này sẽ phát triển như thế nào.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗