Snowflake DATEADD: Hướng dẫn đầy đủ kèm ví dụ thực tế
Tìm hiểu cách sử dụng hàm DATEADD của Snowflake để thao tác ngày với các ví dụ thực tế. Thành thạo tính toán thời gian, xử lý trường hợp biên, và tối ưu hiệu năng trong truy vấn SQL của bạn.
Hàm DATEADD của Snowflake tương đối đơn giản nhưng mạnh mẽ để thực hiện mọi phép toán trên thời gian/ngày tháng, cho phép các chuyên gia dữ liệu cộng hoặc trừ một khoảng thời gian cụ thể từ giá trị date, time, hoặc timestamp.
Hiểu cách sử dụng DATEADD sẽ giúp nhà phân tích/kỹ sư dữ liệu thực hiện các phân tích hữu ích như tính toán kỳ hạn đăng ký, xây dựng dự phóng cho các ngày tương lai, và thậm chí tạo các bộ dữ liệu chuỗi thời gian để phân tích sâu hơn.
Trong hướng dẫn này, bạn sẽ tìm hiểu về cú pháp của hàm, cách áp dụng trong thực tế, và tiềm năng tổng thể của DATEADD trong bộ công cụ thao tác ngày tháng của bạn với Snowflake SQL.
Trước khi đi sâu vào chi tiết DATEADD, hãy tạo một cơ sở dữ liệu mẫu giàu dữ liệu ngày tháng để các ví dụ trở nên thực tiễn và thao tác hơn. Làm việc với dữ liệu thực sẽ giúp củng cố khái niệm khi chúng ta học các khả năng của hàm.
Giờ đây chúng ta có một cơ sở dữ liệu mẫu hoạt động với ba bảng chứa các định dạng date và timestamp khác nhau. Bộ dữ liệu này sẽ làm nền tảng để khám phá hàm DATEADD trong phần còn lại của hướng dẫn này.
Tìm hiểu Snowflake DATEADD: Cú pháp và tham số
Hàm DATEADD là thiết yếu cho các phép toán ngày tháng trong Snowflake. Nó cho phép bạn cộng hoặc trừ các khoảng thời gian cụ thể từ các giá trị date, time, hoặc timestamp. Hãy bắt đầu với cú pháp và tham số của hàm để hiểu cách nó hoạt động.
Cú pháp và tham số của hàm
Cú pháp cơ bản của hàm DATEADD là:
DATEADD(date_part,value, date_or_timestamp_expression)Được hỗ trợ bởi
Hãy xem từng tham số:
-- Basic DATEADD exampleSELECT
DATEADD(MONTH,3,'2023-01-15')AS three_months_later;Được hỗ trợ bởi
Giải thích: Truy vấn này cộng 3 tháng vào ngày 15/01/2023. Các tham số hoạt động như sau:
date_part (MONTH): Xác định đơn vị thời gian cần cộng hoặc trừ
value (3): Số đơn vị cần cộng (dương) hoặc trừ (âm)
date_or_timestamp_expression ('2023-01-15'): Ngày bắt đầu để chỉnh sửa
Kết quả:
THREE_MONTHS_LATER
-----------------2023-04-15Được hỗ trợ bởi
Các phần ngày được hỗ trợ
Snowflake hỗ trợ nhiều phần ngày có thể dùng với DATEADD:
-- Examples of different date partsSELECT
DATEADD(YEAR,1,'2023-02-28')AS add_one_year,
DATEADD(QUARTER,2,'2023-01-31')AS add_two_quarters,
DATEADD(MONTH,3,'2023-01-31')AS add_three_months,
DATEADD(WEEK,2,'2023-03-15')AS add_two_weeks,
DATEADD(DAY,10,'2023-03-21')AS add_ten_days,
DATEADD(HOUR,12,'2023-03-10 08:30:00')AS add_twelve_hours,
DATEADD(MINUTE,45,'2023-03-10 08:30:00')AS add_forty_five_minutes,
DATEADD(SECOND,30,'2023-03-10 08:30:00')AS add_thirty_seconds;Được hỗ trợ bởi
Các phần ngày bổ sung được hỗ trợ gồm MILLISECOND, MICROSECOND, NANOSECOND, và CENTURY.
Lưu ý rằng vào năm nhuận và với các ngày cuối tháng, Snowflake sẽ điều chỉnh phù hợp. Ví dụ, cộng một năm vào ngày 28/02/2023 sẽ ra ngày 29/02/2024 (năm nhuận).
Dùng giá trị âm để trừ
Hàm DATEADD cũng có thể trừ khoảng thời gian bằng cách dùng giá trị âm:
-- Subtracting time intervals with negative valuesSELECT
DATEADD(MONTH,-3,'2023-03-15')AS three_months_ago,
DATEADD(DAY,-7,CURRENT_DATE())AS one_week_ago,
DATEADD(HOUR,-48,CURRENT_TIMESTAMP())AS two_days_ago_time;Được hỗ trợ bởi
Giải thích:
Biểu thức thứ nhất trừ 3 tháng từ ngày 15/03/2023
Biểu thức thứ hai trừ 7 ngày từ ngày hôm nay
Biểu thức thứ ba trừ 48 giờ (2 ngày) từ timestamp hiện tại
Kết quả:
THREE_MONTHS_AGO ONE_WEEK_AGO TWO_DAYS_AGO_TIME
---------------- ------------ -----------------2025-02-102025-05-032025-05-0807:22:30.183-0700Được hỗ trợ bởi
Hành vi kiểu dữ liệu trả về
Kiểu trả về của DATEADD phụ thuộc vào kiểu biểu thức đầu vào:
Khi áp dụng cho DATE, nó trả về DATE
Khi áp dụng cho TIMESTAMP, nó trả về TIMESTAMP
Khi áp dụng cho TIME, nó trả về TIME
DATEADD giữ nguyên kiểu dữ liệu gốc của đầu vào. Hiểu hành vi này là quan trọng vì nó ảnh hưởng đến cách bạn có thể dùng kết quả trong các phép tính tiếp theo.
Ví dụ, nếu bạn cộng giờ vào giá trị DATE, kết quả vẫn là DATE (phần thời gian bị cắt), trong khi cộng giờ vào TIMESTAMP sẽ giữ cả thành phần ngày và giờ.
Hiểu những tham số và hành vi cốt lõi của DATEADD sẽ là nền tảng cho các tình huống nâng cao mà chúng ta sẽ khám phá ở các phần sau.
Ví dụ và tình huống sử dụng DATEADD trong thực tế
Giờ khi đã hiểu cú pháp và hành vi của DATEADD, hãy khám phá các ứng dụng thực tế bằng dữ liệu mẫu của chúng ta. Phần này sẽ cho thấy cách DATEADD giải quyết các bài toán kinh doanh và nâng cao năng lực phân tích dữ liệu.
Tính ngày gia hạn đăng ký
Một yêu cầu phổ biến là xác định thời điểm đăng ký sẽ gia hạn dựa trên chu kỳ thanh toán:
Giải thích: Truy vấn này tính ngày gia hạn đầu tiên cho mỗi đăng ký dựa trên chu kỳ thanh toán. Chúng ta dùng DATEADD với các phần ngày (MONTH hoặc YEAR) và giá trị (1, 3, hoặc 1) tùy theo chu kỳ.
Kết quả:
Lưu ý cách Snowflake xử lý đúng chuyển tiếp từ 28/02 sang 28/02 (năm nhuận).
Dự báo khung thời gian giao hàng
Hãy dùng DATEADD để tính khung thời gian giao hàng ước tính cho đơn hàng:
-- Calculate delivery windows based on order timestampsSELECT
order_id,
customer_id,
order_timestamp,
delivery_estimate,
DATEADD(HOUR,-12, delivery_estimate)AS delivery_window_start,
delivery_estimate AS delivery_window_end,
DATEDIFF('HOUR', order_timestamp, delivery_estimate)AS estimated_hours_to_delivery
FROM orders
ORDERBY order_id;Được hỗ trợ bởi
Giải thích: Truy vấn này:
Tạo khung giao hàng 12 giờ bằng cách trừ 12 giờ từ thời gian giao dự kiến
Hiển thị cả thời điểm bắt đầu và kết thúc khung giao hàng
Tính tổng thời gian giao hàng ước tính theo giờ
Kết quả:
Tạo bảng chiều ngày
Phân tích chuỗi thời gian thường cần một bảng chiều ngày. Hãy tạo một bảng dùng DATEADD:
-- Generate a date dimension table for analysisWITH date_dimension AS(SELECT
DATEADD(DAY, seq4(),'2023-01-01')AS calendar_date
FROMTABLE(GENERATOR(ROWCOUNT=>365)))SELECT
calendar_date,YEAR(calendar_date)ASyear,MONTH(calendar_date)ASmonth,
MONTHNAME(calendar_date)AS month_name,DAY(calendar_date)ASday,
DAYOFWEEK(calendar_date)AS day_of_week,
DAYNAME(calendar_date)AS day_name,CASEWHEN DAYOFWEEK(calendar_date)IN(0,6)THENTRUEELSEFALSEENDAS is_weekend,
QUARTER(calendar_date)AS quarter
FROM date_dimension
WHERE calendar_date <='2023-03-31'ORDERBY calendar_date
LIMIT10;Được hỗ trợ bởi
Giải thích: Truy vấn này:
Dùng DATEADD với bộ sinh chuỗi để tạo dãy ngày cho năm 2023
Trích xuất các thuộc tính ngày hữu ích cho mỗi ngày
Lọc tới quý 1/2023 và hiển thị 10 ngày đầu để gọn
Kết quả:
Các bảng chiều ngày giúp cải thiện hiệu năng phân tích đáng kể bằng cách tính trước các thuộc tính ngày thay vì tính lặp lại trong truy vấn. Chúng chuẩn hóa logic ngày trong toàn tổ chức, đảm bảo định nghĩa nhất quán về quý, cuối tuần, và các khoảng thời gian khác.
Cách tiếp cận này giảm lỗi và giúp phân tích thời gian phức tạp dễ tiếp cận hơn với người dùng nghiệp vụ. Bảng chiều ngày cũng cho phép lọc và nhóm hiệu quả theo nhiều phân cấp thời gian như năm, quý, tháng, và ngày.
Hàm DATEADD kết hợp với sinh chuỗi cung cấp phương pháp đơn giản để nạp dữ liệu cho các bảng chiều này mà không cần nhập tay.
Kỹ thuật này có thể mở rộng để tạo lịch nhiều năm hoặc các chiều thời gian chuyên biệt như lịch tài chính hoặc tính ngày làm việc. Các cột bổ sung có thể gồm cờ ngày nghỉ lễ, số tuần, hoặc các khoảng kỳ doanh nghiệp tùy chỉnh quan trọng cho báo cáo chính xác.
Khi đã tạo, bảng chiều này có thể join với các bảng fact để kích hoạt năng lực phân tích thời gian mạnh mẽ trong dashboard và báo cáo.
Phân tích các sự kiện đã lên lịch
Hãy dùng DATEADD để phân tích các sự kiện bảo trì sắp tới:
-- Find upcoming events and calculate preparation timeSELECT
event_id,
event_name,
event_timestamp,
duration_minutes,
DATEADD(DAY,-3, event_timestamp)AS preparation_start,
DATEADD(MINUTE, duration_minutes, event_timestamp)AS event_end,
DATEDIFF('MINUTE',CURRENT_TIMESTAMP(), event_timestamp)AS minutes_until_event
FROM events
WHERE event_timestamp >CURRENT_TIMESTAMP()ORDERBY event_timestamp;Được hỗ trợ bởi
Giải thích: Truy vấn này:
Tìm các sự kiện sắp diễn ra (trong tương lai)
Tính thời điểm nên bắt đầu chuẩn bị (3 ngày trước sự kiện)
Tính thời điểm kết thúc dựa trên thời lượng sự kiện
Cho biết còn bao nhiêu phút tới khi sự kiện bắt đầu
Vì tất cả dữ liệu mẫu là năm 2023, truy vấn này thường sẽ không trả về kết quả vào năm 2025, nhưng về mặt khái niệm cho thấy cách phân tích các sự kiện đã lên lịch.
Tính các kỳ thanh toán
Với doanh nghiệp dựa trên mô hình đăng ký, tính chính xác các kỳ thanh toán là thiết yếu:
-- Generate next 6 billing periods for monthly subscriptionsWITH billing_periods AS(SELECT
subscription_id,
customer_id,
plan_name,
start_date,
seq AS billing_period_number,
DATEADD(MONTH, seq, start_date)AS billing_period_start,
DATEADD(DAY,-1, DATEADD(MONTH, seq +1, start_date))AS billing_period_end
FROM subscriptions
CROSSJOIN(SELECT seq4()AS seq FROMTABLE(GENERATOR(ROWCOUNT=>6)))WHERE billing_cycle ='Monthly')SELECT
subscription_id,
customer_id,
plan_name,
billing_period_number,
billing_period_start,
billing_period_end,
DATEDIFF('DAY', billing_period_start, billing_period_end)+1AS days_in_period
FROM billing_periods
ORDERBY subscription_id, billing_period_number;Được hỗ trợ bởi
Giải thích: Truy vấn này:
Tạo 6 kỳ thanh toán tiếp theo cho đăng ký theo tháng bằng CROSS JOIN với bộ sinh chuỗi (seq4())
Tính ngày bắt đầu bằng cách cộng số tháng theo số thứ tự kỳ bằng DATEADD(MONTH, seq, start_date)
Tính ngày kết thúc là một ngày trước khi kỳ tiếp theo bắt đầu với DATEADD(DAY, -1, DATEADD(MONTH, seq + 1, start_date))Đảm bảo xử lý đúng độ dài tháng khác nhau (28/29/30/31 ngày)
Đếm số ngày trong mỗi kỳ thanh toán bằng DATEDIFF('DAY', billing_period_start, billing_period_end) + 1Cộng +1 vì DATEDIFF trả về chênh lệch giữa các ngày, không bao gồm ngày kết thúc
Chỉ lọc các đăng ký theo tháng với mệnh đề WHERE
Sắp xếp theo subscription_id và số thứ tự kỳ để hiển thị hợp lý
Kết quả:
Lưu ý DATEADD xử lý đúng độ dài tháng khác nhau, đảm bảo tính kỳ thanh toán chính xác.
Các ví dụ này cho thấy DATEADD có thể áp dụng để giải quyết những bài toán kinh doanh phổ biến liên quan đến thao tác ngày tháng. Bằng cách kết hợp DATEADD với các hàm SQL khác, bạn có thể xây dựng các truy vấn mạnh mẽ cho phân tích theo thời gian và xử lý dữ liệu trong Snowflake.
So sánh DATEADD với các hàm liên quan của Snowflake
Giờ hãy xem DATEADD so với một số hàm khác của Snowflake như thế nào.
DATEADD so với DATEDIFF và DATE_TRUNC
Trong khi DATEADD cộng hoặc trừ một khoảng thời gian cụ thể vào một ngày, DATEDIFF tính chênh lệch giữa hai ngày theo một đơn vị xác định. DATEDIFF trả về số nguyên đại diện cho số đơn vị hoàn chỉnh giữa các ngày, rất lý tưởng để tính độ dài đăng ký hoặc số ngày từ khi đặt hàng.
DATE_TRUNC, ngược lại, loại bỏ độ chính xác khỏi giá trị ngày/giờ bằng cách đặt các phần ngày nhỏ hơn về giá trị mặc định, hiệu quả là làm tròn xuống tới đơn vị xác định.
-- Comparing the three functionsSELECT
DATEADD(MONTH,3,'2023-01-15'::DATE)AS added_three_months,
DATEDIFF(DAY,'2023-01-15'::DATE,'2023-04-15'::DATE)AS days_between,
DATE_TRUNC(MONTH,'2023-01-15'::DATE)AS truncated_to_month;Được hỗ trợ bởi
Kết quả:
Khi nào nên dùng từng hàm (tiêu chí quyết định)
Dùng DATEADD khi bạn cần dịch chuyển ngày về phía trước hoặc lùi lại theo khoảng thời gian cụ thể, như tính ngày gia hạn tương lai, khung giao hàng, hoặc lịch thanh toán.
Chọn DATEDIFF khi đo thời gian trôi qua giữa hai ngày, như tính tuổi, thời lượng, hoặc các chỉ số theo thời gian cho báo cáo.
DATE_TRUNC phù hợp nhất khi bạn cần nhóm dữ liệu theo các khoảng thời gian (ngày, tháng, quý), chuẩn hóa timestamp về một mức độ chính xác nhất quán, hoặc tạo phân cấp thời gian để phân tích.
-- Function usage by scenarioSELECT-- Scenario: Calculate next month's billing date
DATEADD(MONTH,1, start_date)AS next_billing_date,-- Scenario: Find how many days the subscription has been active
DATEDIFF(DAY, start_date,CURRENT_DATE())AS subscription_age_days,-- Scenario: Group by month for analysis
DATE_TRUNC(MONTH, start_date)AS billing_month
FROM subscriptions
LIMIT3;Được hỗ trợ bởi
Xử lý các trường hợp biên và khắc phục sự cố
Nếu bạn gặp vấn đề khi dùng hàm, dưới đây là một số mẹo có thể giúp bạn xử lý.
Điều chỉnh cuối tháng và năm nhuận
Snowflake xử lý thông minh các ngày cuối tháng khi dùng DATEADD. Khi cộng tháng vào một ngày cuối tháng, Snowflake trả về ngày cuối cùng của tháng kết quả, bất kể số ngày của tháng. Hành vi này giữ nguyên khái niệm "cuối tháng" ngay cả khi các tháng có độ dài khác nhau.
-- Month-end handling examplesSELECT
DATEADD(MONTH,1,'2023-01-31')AS jan_to_feb,-- January 31 + 1 month = February 28
DATEADD(MONTH,1,'2023-02-28')AS feb_to_mar,-- February 28 + 1 month = March 31
DATEADD(MONTH,1,'2024-01-31')AS jan_to_feb_leap,-- January 31 + 1 month in leap year = February 29
DATEADD(YEAR,1,'2023-02-28')AS normal_to_leap;-- February 28, 2023 + 1 year = February 29, 2024Được hỗ trợ bởi
Múi giờ và xem xét giờ mùa hè
Khi làm việc với dữ liệu timestamp có múi giờ (TIMESTAMP_TZ), DATEADD tự động tính đến các chuyển đổi Giờ Tiết Kiệm Ánh Sáng (DST). Điều này đảm bảo các phép tính chính xác qua các thay đổi giờ, nhưng đôi khi có thể cho kết quả bất ngờ khi cộng khoảng thời gian cụ thể quanh ranh giới DST.
-- Time zone handling with DST transitionSELECT
event_timestamp,
DATEADD(HOUR,24, event_timestamp)AS add_24h,
DATEADD(DAY,1, event_timestamp)AS add_1d
FROM(SELECT CONVERT_TIMEZONE('America/Los_Angeles','2023-03-12 01:30:00')::TIMESTAMP_TZ AS event_timestamp
);-- During spring forward DST transitionĐược hỗ trợ bởi
Khi làm việc với timestamp quanh thời điểm chuyển DST, hãy lưu ý rằng cộng 24 giờ có thể không bằng cộng 1 ngày. Cách “add_1d" thường cho kết quả trực quan hơn trong các ứng dụng nghiệp vụ.
Lỗi thường gặp và cách khắc phục
Các lỗi DATEADD thường bắt nguồn từ không khớp kiểu hoặc đầu vào không hợp lệ. Dưới đây là các vấn đề phổ biến và giải pháp:
-- Common error: Invalid date part-- Error: "Invalid date part 'DATE'"SELECT DATEADD(DATE,1,'2023-01-15');-- Incorrect: 'DATE' is not a valid date partSELECT DATEADD(DAY,1,'2023-01-15');-- Correct: use 'DAY' instead-- Common error: Type mismatch-- Error: "Numeric value 'abc' is not recognized"SELECT DATEADD(DAY,'abc','2023-01-15');-- Incorrect: second parameter must be numericSELECT DATEADD(DAY,10,'2023-01-15');-- Correct: use numeric value-- Common error: Invalid date format-- Error: "Date 'January 15, 2023' is not recognized"SELECT DATEADD(DAY,1,'January 15, 2023');-- Incorrect: unrecognized date formatSELECT DATEADD(DAY,1,'2023-01-15');-- Correct: use YYYY-MM-DD formatĐược hỗ trợ bởi
Mẹo tối ưu hiệu năng
Để có hiệu năng tốt nhất khi dùng DATEADD trong các tác vụ quy mô lớn:
Áp dụng DATEADD ở giai đoạn transform thay vì filter khi có thể.
Tiền tính các phép tính ngày phổ biến vào bảng tạm hoặc CTE khi dùng nhiều lần.
Cân nhắc dùng DATE_TRUNC trước DATEADD cho các tính toán theo phạm vi để cải thiện việc sử dụng chỉ mục.
Với các tác vụ theo lô như tạo dải ngày, dùng bộ sinh chuỗi (như ví dụ bảng chiều ngày) thay vì CTE đệ quy.
-- Inefficient pattern (calculating same value repeatedly)SELECT*FROM large_table
WHERE DATEADD(MONTH,1, event_date)<CURRENT_DATE();-- More efficient approach (calculate once)WITH calc_dates AS(SELECT*, DATEADD(MONTH,1, event_date)AS next_month_date
FROM large_table
)SELECT*FROM calc_dates
WHERE next_month_date <CURRENT_DATE();Được hỗ trợ bởi
Hiểu các trường hợp biên và kỹ thuật tối ưu này sẽ giúp bạn viết logic thao tác ngày tháng bền vững hơn trong Snowflake, tránh các lỗi phổ biến đồng thời tối đa hóa hiệu năng.
Kết luận
Hàm DATEADD của Snowflake là công cụ thiết yếu để thao tác ngày tháng, cho phép các chuyên gia dữ liệu thực hiện số học thời gian trên nhiều phần ngày khác nhau. Nó xử lý các ngày cuối tháng, năm nhuận, múi giờ, và chuyển đổi DST với hành vi có thể dự đoán. Chúng ta đã thấy DATEADD được áp dụng trong quản lý đăng ký, theo dõi giao hàng, tạo bảng chiều ngày, và tính toán kỳ thanh toán. Khi dùng cùng với DATEDIFF và DATE_TRUNC, nó trở thành thành phần cốt lõi cho phân tích theo thời gian trong Snowflake.
Hàm DATEADD của Snowflake được dùng để thực hiện các phép toán trên ngày bằng cách cộng hoặc trừ các khoảng thời gian cụ thể (như ngày, tháng, hoặc năm) từ các giá trị date, time, hoặc timestamp. Nó thường được dùng để tính các ngày trong tương lai, gia hạn đăng ký, và phân tích chuỗi thời gian.
DATEADD xử lý ngày cuối tháng và năm nhuận như thế nào?⌄
DATEADD xử lý thông minh các ngày cuối tháng bằng cách giữ nguyên khái niệm "cuối tháng". Khi cộng tháng vào một ngày cuối tháng, nó trả về ngày cuối của tháng kết quả. Với năm nhuận, nó tự động điều chỉnh ngày cho phù hợp (ví dụ, cộng một năm vào 28/02/2023 sẽ ra 29/02/2024).
Các phần ngày được DATEADD hỗ trợ là gì?⌄
DATEADD hỗ trợ nhiều phần ngày gồm YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MILLISECOND, MICROSECOND, NANOSECOND, và CENTURY. Mỗi phần cho phép bạn cộng hoặc trừ đơn vị thời gian đó khỏi một giá trị ngày.
DATEADD có dùng được với các kiểu timestamp khác nhau không?⌄
Có, DATEADD hoạt động với tất cả các kiểu timestamp của Snowflake: TIMESTAMP_NTZ (không múi giờ), TIMESTAMP_TZ (có múi giờ), và TIMESTAMP_LTZ (múi giờ cục bộ). Nó giữ nguyên kiểu timestamp và tự động xử lý chuyển đổi múi giờ.
DATEADD khác gì so với DATEDIFF và DATE_TRUNC?⌄
Trong khi DATEADD thay đổi ngày bằng cách cộng hoặc trừ khoảng thời gian, DATEDIFF tính chênh lệch giữa hai ngày theo một đơn vị xác định, và DATE_TRUNC loại bỏ độ chính xác khỏi giá trị ngày/giờ bằng cách làm tròn xuống đến một đơn vị xác định. Chúng phục vụ các mục đích khác nhau nhưng bổ trợ cho nhau trong thao tác ngày tháng.
Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng người theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt khô khan. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, cùng với một khóa nữa đang được thực hiện. Nội dung của tôi đã được hơn 5 triệu lượt xem, trong đó 20 nghìn người đã trở thành người theo dõi trên cả Medium và LinkedIn.
Hãy trải nghiệm Snowflake! Học cách truy vấn, mô hình hóa và quản lý dữ liệu trong khóa học giới thiệu tương tác này dành cho các kỹ sư dữ liệu, nhà phân tích và chuyên gia BI.
Học cách thiết kế, truy vấn và xây dựng trong Snowflake - thành thạo SQL của Snowflake để thực hiện chuyển đổi và mô hình hóa, nhằm trở thành một Kỹ sư Dữ liệu sẵn sàng cho công việc.
Hàm
DATEADDcủa Snowflake tương đối đơn giản nhưng mạnh mẽ để thực hiện mọi phép toán trên thời gian/ngày tháng, cho phép các chuyên gia dữ liệu cộng hoặc trừ một khoảng thời gian cụ thể từ giá trị date, time, hoặc timestamp.Hiểu cách sử dụng
DATEADDsẽ giúp nhà phân tích/kỹ sư dữ liệu thực hiện các phân tích hữu ích như tính toán kỳ hạn đăng ký, xây dựng dự phóng cho các ngày tương lai, và thậm chí tạo các bộ dữ liệu chuỗi thời gian để phân tích sâu hơn.Trong hướng dẫn này, bạn sẽ tìm hiểu về cú pháp của hàm, cách áp dụng trong thực tế, và tiềm năng tổng thể của
DATEADDtrong bộ công cụ thao tác ngày tháng của bạn với Snowflake SQL.Nếu bạn mới bắt đầu với Snowflake, hãy xem lộ trình kỹ năng Snowflake Foundations của chúng tôi.
Thiết lập cơ sở dữ liệu mẫu để thực hành
Trước khi đi sâu vào chi tiết
DATEADD, hãy tạo một cơ sở dữ liệu mẫu giàu dữ liệu ngày tháng để các ví dụ trở nên thực tiễn và thao tác hơn. Làm việc với dữ liệu thực sẽ giúp củng cố khái niệm khi chúng ta học các khả năng của hàm.1. Tạo tài khoản Snowflake (cho người dùng mới)
Nếu bạn mới dùng Snowflake, bạn sẽ cần tạo tài khoản dùng thử miễn phí với tín dụng trong 30 ngày. Để có phần giới thiệu toàn diện về nền tảng, hãy xem khóa học Introduction to Snowflake, bao quát các nền tảng và kiến thức cơ bản.
2. Thiết lập worksheet của bạn
Trong Snowflake, các truy vấn SQL được thực thi trong “Worksheets” (tương tự notebook). Để tạo worksheet mới:
Nếu bạn hoàn toàn mới với giao diện Snowflake, Snowflake Tutorial For Beginners này sẽ hướng dẫn bạn sử dụng nền tảng.
3. Chọn cơ sở dữ liệu và schema
Trong hướng dẫn này, chúng ta sẽ dùng cơ sở dữ liệu Snowflake Learning và schema public:
4. Tạo dữ liệu và bảng tổng hợp
Chúng ta sẽ tạo ba bảng với dữ liệu liên quan đến ngày tháng để minh họa ‘DATEADD’ trong nhiều kịch bản khác nhau:
Lưu ý: Dùng “Command + Shift + Enter”/”Ctrl + Shift + Enter” để chạy toàn bộ các lệnh sau trong worksheet của bạn cùng lúc:
Để biết thêm chi tiết về việc tạo bảng, bao gồm các loại bảng khác nhau và thực tiễn tốt nhất, hãy tham khảo Creating Tables in Snowflake.
Mẹo: Bạn nên xóa tất cả truy vấn hiện có khỏi worksheet sau khi chúng chạy thành công.
5. Nạp dữ liệu mẫu vào bảng
Hãy chèn dữ liệu mẫu với nhiều giá trị ngày và thời gian khác nhau:
6. Xác thực dữ liệu mẫu
Hãy chạy vài truy vấn cơ bản để xác minh dữ liệu đã được nạp chính xác:
Giờ đây chúng ta có một cơ sở dữ liệu mẫu hoạt động với ba bảng chứa các định dạng date và timestamp khác nhau. Bộ dữ liệu này sẽ làm nền tảng để khám phá hàm
DATEADDtrong phần còn lại của hướng dẫn này.Tìm hiểu Snowflake DATEADD: Cú pháp và tham số
Hàm
DATEADDlà thiết yếu cho các phép toán ngày tháng trong Snowflake. Nó cho phép bạn cộng hoặc trừ các khoảng thời gian cụ thể từ các giá trị date, time, hoặc timestamp. Hãy bắt đầu với cú pháp và tham số của hàm để hiểu cách nó hoạt động.Cú pháp và tham số của hàm
Cú pháp cơ bản của hàm
DATEADDlà:Hãy xem từng tham số:
Giải thích: Truy vấn này cộng 3 tháng vào ngày 15/01/2023. Các tham số hoạt động như sau:
date_part (MONTH): Xác định đơn vị thời gian cần cộng hoặc trừvalue (3): Số đơn vị cần cộng (dương) hoặc trừ (âm)date_or_timestamp_expression('2023-01-15'): Ngày bắt đầu để chỉnh sửaKết quả:
Các phần ngày được hỗ trợ
Snowflake hỗ trợ nhiều phần ngày có thể dùng với
DATEADD:Các phần ngày bổ sung được hỗ trợ gồm
MILLISECOND,MICROSECOND,NANOSECOND, vàCENTURY.Lưu ý rằng vào năm nhuận và với các ngày cuối tháng, Snowflake sẽ điều chỉnh phù hợp. Ví dụ, cộng một năm vào ngày 28/02/2023 sẽ ra ngày 29/02/2024 (năm nhuận).
Dùng giá trị âm để trừ
Hàm
DATEADDcũng có thể trừ khoảng thời gian bằng cách dùng giá trị âm:Giải thích:
Kết quả:
Hành vi kiểu dữ liệu trả về
Kiểu trả về của
DATEADDphụ thuộc vào kiểu biểu thức đầu vào:DATE, nó trả vềDATETIMESTAMP, nó trả vềTIMESTAMPTIME, nó trả vềTIMEDATEADDgiữ nguyên kiểu dữ liệu gốc của đầu vào. Hiểu hành vi này là quan trọng vì nó ảnh hưởng đến cách bạn có thể dùng kết quả trong các phép tính tiếp theo.Ví dụ, nếu bạn cộng giờ vào giá trị DATE, kết quả vẫn là DATE (phần thời gian bị cắt), trong khi cộng giờ vào
TIMESTAMPsẽ giữ cả thành phần ngày và giờ.Hiểu những tham số và hành vi cốt lõi của
DATEADDsẽ là nền tảng cho các tình huống nâng cao mà chúng ta sẽ khám phá ở các phần sau.Ví dụ và tình huống sử dụng DATEADD trong thực tế
Giờ khi đã hiểu cú pháp và hành vi của
DATEADD, hãy khám phá các ứng dụng thực tế bằng dữ liệu mẫu của chúng ta. Phần này sẽ cho thấy cáchDATEADDgiải quyết các bài toán kinh doanh và nâng cao năng lực phân tích dữ liệu.Tính ngày gia hạn đăng ký
Một yêu cầu phổ biến là xác định thời điểm đăng ký sẽ gia hạn dựa trên chu kỳ thanh toán:
Giải thích: Truy vấn này tính ngày gia hạn đầu tiên cho mỗi đăng ký dựa trên chu kỳ thanh toán. Chúng ta dùng
DATEADDvới các phần ngày (MONTHhoặcYEAR) và giá trị (1, 3, hoặc 1) tùy theo chu kỳ.Kết quả:
Lưu ý cách Snowflake xử lý đúng chuyển tiếp từ 28/02 sang 28/02 (năm nhuận).
Dự báo khung thời gian giao hàng
Hãy dùng DATEADD để tính khung thời gian giao hàng ước tính cho đơn hàng:
Giải thích: Truy vấn này:
Kết quả:
Tạo bảng chiều ngày
Phân tích chuỗi thời gian thường cần một bảng chiều ngày. Hãy tạo một bảng dùng DATEADD:
Giải thích: Truy vấn này:
DATEADDvới bộ sinh chuỗi để tạo dãy ngày cho năm 2023Kết quả:
Các bảng chiều ngày giúp cải thiện hiệu năng phân tích đáng kể bằng cách tính trước các thuộc tính ngày thay vì tính lặp lại trong truy vấn. Chúng chuẩn hóa logic ngày trong toàn tổ chức, đảm bảo định nghĩa nhất quán về quý, cuối tuần, và các khoảng thời gian khác.
Cách tiếp cận này giảm lỗi và giúp phân tích thời gian phức tạp dễ tiếp cận hơn với người dùng nghiệp vụ. Bảng chiều ngày cũng cho phép lọc và nhóm hiệu quả theo nhiều phân cấp thời gian như năm, quý, tháng, và ngày.
Hàm
DATEADDkết hợp với sinh chuỗi cung cấp phương pháp đơn giản để nạp dữ liệu cho các bảng chiều này mà không cần nhập tay.Kỹ thuật này có thể mở rộng để tạo lịch nhiều năm hoặc các chiều thời gian chuyên biệt như lịch tài chính hoặc tính ngày làm việc. Các cột bổ sung có thể gồm cờ ngày nghỉ lễ, số tuần, hoặc các khoảng kỳ doanh nghiệp tùy chỉnh quan trọng cho báo cáo chính xác.
Khi đã tạo, bảng chiều này có thể join với các bảng fact để kích hoạt năng lực phân tích thời gian mạnh mẽ trong dashboard và báo cáo.
Phân tích các sự kiện đã lên lịch
Hãy dùng
DATEADDđể phân tích các sự kiện bảo trì sắp tới:Giải thích: Truy vấn này:
Vì tất cả dữ liệu mẫu là năm 2023, truy vấn này thường sẽ không trả về kết quả vào năm 2025, nhưng về mặt khái niệm cho thấy cách phân tích các sự kiện đã lên lịch.
Tính các kỳ thanh toán
Với doanh nghiệp dựa trên mô hình đăng ký, tính chính xác các kỳ thanh toán là thiết yếu:
Giải thích: Truy vấn này:
seq4())DATEADD(MONTH, seq, start_date)DATEADD(DAY, -1, DATEADD(MONTH, seq + 1, start_date))Đảm bảo xử lý đúng độ dài tháng khác nhau (28/29/30/31 ngày)DATEDIFF('DAY', billing_period_start, billing_period_end) + 1Cộng +1 vì DATEDIFF trả về chênh lệch giữa các ngày, không bao gồm ngày kết thúcsubscription_idvà số thứ tự kỳ để hiển thị hợp lýKết quả:
Lưu ý
DATEADDxử lý đúng độ dài tháng khác nhau, đảm bảo tính kỳ thanh toán chính xác.Các ví dụ này cho thấy
DATEADDcó thể áp dụng để giải quyết những bài toán kinh doanh phổ biến liên quan đến thao tác ngày tháng. Bằng cách kết hợpDATEADDvới các hàm SQL khác, bạn có thể xây dựng các truy vấn mạnh mẽ cho phân tích theo thời gian và xử lý dữ liệu trong Snowflake.So sánh DATEADD với các hàm liên quan của Snowflake
Giờ hãy xem
DATEADDso với một số hàm khác của Snowflake như thế nào.DATEADD so với DATEDIFF và DATE_TRUNC
Trong khi
DATEADDcộng hoặc trừ một khoảng thời gian cụ thể vào một ngày,DATEDIFFtính chênh lệch giữa hai ngày theo một đơn vị xác định.DATEDIFFtrả về số nguyên đại diện cho số đơn vị hoàn chỉnh giữa các ngày, rất lý tưởng để tính độ dài đăng ký hoặc số ngày từ khi đặt hàng.DATE_TRUNC, ngược lại, loại bỏ độ chính xác khỏi giá trị ngày/giờ bằng cách đặt các phần ngày nhỏ hơn về giá trị mặc định, hiệu quả là làm tròn xuống tới đơn vị xác định.Kết quả:
Khi nào nên dùng từng hàm (tiêu chí quyết định)
Dùng
DATEADDkhi bạn cần dịch chuyển ngày về phía trước hoặc lùi lại theo khoảng thời gian cụ thể, như tính ngày gia hạn tương lai, khung giao hàng, hoặc lịch thanh toán.Chọn
DATEDIFFkhi đo thời gian trôi qua giữa hai ngày, như tính tuổi, thời lượng, hoặc các chỉ số theo thời gian cho báo cáo.DATE_TRUNCphù hợp nhất khi bạn cần nhóm dữ liệu theo các khoảng thời gian (ngày, tháng, quý), chuẩn hóa timestamp về một mức độ chính xác nhất quán, hoặc tạo phân cấp thời gian để phân tích.Xử lý các trường hợp biên và khắc phục sự cố
Nếu bạn gặp vấn đề khi dùng hàm, dưới đây là một số mẹo có thể giúp bạn xử lý.
Điều chỉnh cuối tháng và năm nhuận
Snowflake xử lý thông minh các ngày cuối tháng khi dùng
DATEADD. Khi cộng tháng vào một ngày cuối tháng, Snowflake trả về ngày cuối cùng của tháng kết quả, bất kể số ngày của tháng. Hành vi này giữ nguyên khái niệm "cuối tháng" ngay cả khi các tháng có độ dài khác nhau.Múi giờ và xem xét giờ mùa hè
Khi làm việc với dữ liệu timestamp có múi giờ (
TIMESTAMP_TZ), DATEADD tự động tính đến các chuyển đổi Giờ Tiết Kiệm Ánh Sáng (DST). Điều này đảm bảo các phép tính chính xác qua các thay đổi giờ, nhưng đôi khi có thể cho kết quả bất ngờ khi cộng khoảng thời gian cụ thể quanh ranh giới DST.Khi làm việc với timestamp quanh thời điểm chuyển DST, hãy lưu ý rằng cộng 24 giờ có thể không bằng cộng 1 ngày. Cách “add_1d" thường cho kết quả trực quan hơn trong các ứng dụng nghiệp vụ.
Lỗi thường gặp và cách khắc phục
Các lỗi DATEADD thường bắt nguồn từ không khớp kiểu hoặc đầu vào không hợp lệ. Dưới đây là các vấn đề phổ biến và giải pháp:
Mẹo tối ưu hiệu năng
Để có hiệu năng tốt nhất khi dùng
DATEADDtrong các tác vụ quy mô lớn:DATEADDở giai đoạn transform thay vì filter khi có thể.DATEADDcho các tính toán theo phạm vi để cải thiện việc sử dụng chỉ mục.Hiểu các trường hợp biên và kỹ thuật tối ưu này sẽ giúp bạn viết logic thao tác ngày tháng bền vững hơn trong Snowflake, tránh các lỗi phổ biến đồng thời tối đa hóa hiệu năng.
Kết luận
Hàm
DATEADDcủa Snowflake là công cụ thiết yếu để thao tác ngày tháng, cho phép các chuyên gia dữ liệu thực hiện số học thời gian trên nhiều phần ngày khác nhau. Nó xử lý các ngày cuối tháng, năm nhuận, múi giờ, và chuyển đổi DST với hành vi có thể dự đoán. Chúng ta đã thấyDATEADDđược áp dụng trong quản lý đăng ký, theo dõi giao hàng, tạo bảng chiều ngày, và tính toán kỳ thanh toán. Khi dùng cùng vớiDATEDIFFvàDATE_TRUNC, nó trở thành thành phần cốt lõi cho phân tích theo thời gian trong Snowflake.Để học thêm về Snowflake, hãy xem Snowflake Foundations hoặc khám phá Creating Tables in Snowflake để xây dựng kỹ năng mô hình dữ liệu. Hướng dẫn Using Snowflake Time Travel sẽ bổ sung hiểu biết của bạn về các thao tác thời gian. Người mới bắt đầu nên khởi động với Snowflake Tutorial for Beginners.