Những vấn đề bất ngờ khi sử dụng Lịch tùy chỉnh trong Power BI và Fabric
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.

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 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ậ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ầ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 liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
