Chuyển đến nội dung chính

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.
· 10 phút đọc

Khám phá cùng AI

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.

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:

  1. Đăng nhập vào tài khoản Snowflake của bạn
  2. Đi tới Worksheets từ menu chính
  3. Nhấp nút “+” để tạo worksheet mới
  4. Đặt tên là “DATEADD_Practice”

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:

-- Create database and schema
USE DATABASE SNOWFLAKE_LEARNING_DB;
USE 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:

-- Create subscription table
CREATE OR REPLACE TABLE subscriptions (
   subscription_id INTEGER,
   customer_id INTEGER,
   plan_name VARCHAR(50),
   start_date DATE,
   end_date DATE,
   billing_cycle VARCHAR(20)
);

-- Create orders table with timestamps
CREATE OR REPLACE TABLE orders (
   order_id INTEGER,
   customer_id INTEGER,
   order_timestamp TIMESTAMP_NTZ,
   delivery_estimate TIMESTAMP_NTZ,
   total_amount DECIMAL(10,2)
);

-- Create events table with time zones
CREATE OR REPLACE TABLE events (
   event_id INTEGER,
   event_name VARCHAR(100),
   event_timestamp TIMESTAMP_TZ,
   duration_minutes INTEGER
);

Để 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:

-- Insert subscription data
INSERT INTO subscriptions VALUES
   (1001, 5001, 'Basic', '2023-01-15', '2023-07-15', 'Monthly'),
   (1002, 5002, 'Premium', '2023-02-28', '2024-02-28', 'Annual'),
   (1003, 5003, 'Premium', '2023-01-31', '2023-04-30', 'Quarterly'),
   (1004, 5001, 'Pro', '2022-12-15', '2023-12-15', 'Annual'),
   (1005, 5004, 'Basic', '2023-03-15', NULL, 'Monthly');

-- Insert orders with timestamps
INSERT INTO orders VALUES
   (10001, 5001, '2023-03-10 08:30:00', '2023-03-12 14:00:00', 125.99),
   (10002, 5002, '2023-03-10 12:15:30', '2023-03-11 09:00:00', 89.50),
   (10003, 5003, '2023-03-09 17:45:20', '2023-03-15 13:30:00', 245.00),
   (10004, 5001, '2023-02-28 23:59:59', '2023-03-05 10:00:00', 49.99),
   (10005, 5004, '2023-03-01 00:00:01', '2023-03-02 12:00:00', 175.25);

-- Insert events
INSERT INTO events VALUES
   (101, 'System Update', '2023-03-15 01:00:00'::TIMESTAMP_TZ, 120),
   (102, 'Maintenance', '2023-03-20 22:00:00'::TIMESTAMP_TZ, 60),
   (103, 'Data Migration', '2023-03-18 15:30:00'::TIMESTAMP_TZ, 180),
   (104, 'Backup', '2023-03-10 03:00:00'::TIMESTAMP_TZ, 45),
   (105, 'Security Audit', '2023-03-12 09:15:00'::TIMESTAMP_TZ, 90);

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:

-- Check subscription data
SELECT * FROM subscriptions;

-- Check orders data
SELECT * FROM orders;

-- Check events data
SELECT * FROM events;

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)

Hãy xem từng tham số:

-- Basic DATEADD example
SELECT
   DATEADD(MONTH, 3, '2023-01-15') AS three_months_later;

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á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 parts
SELECT
   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á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 values
SELECT
   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;

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-10          2025-05-03      2025-05-08 07:22:30.183 -0700

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:

-- Calculate subscription renewal dates
SELECT
   subscription_id,
   customer_id,
   plan_name,
   start_date,
   billing_cycle,
   CASE
       WHEN billing_cycle = 'Monthly' THEN DATEADD(MONTH, 1, start_date)
       WHEN billing_cycle = 'Quarterly' THEN DATEADD(MONTH, 3, start_date)
       WHEN billing_cycle = 'Annual' THEN DATEADD(YEAR, 1, start_date)
   END AS first_renewal_date
FROM subscriptions;

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ả:

Kết quả truy vấn Snowflake sử dụng hàm DATEADD

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 timestamps
SELECT
   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
ORDER BY order_id;

Giải thích: Truy vấn này:

  1. Tạo khung giao hàng 12 giờ bằng cách trừ 12 giờ từ thời gian giao dự kiến
  2. Hiển thị cả thời điểm bắt đầu và kết thúc khung giao hàng
  3. Tính tổng thời gian giao hàng ước tính theo giờ

Kết quả:

Kết quả truy vấn Snowflake sử dụng hàm DATEADD

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 analysis
WITH date_dimension AS (
   SELECT
       DATEADD(DAY, seq4(), '2023-01-01') AS calendar_date
   FROM TABLE(GENERATOR(ROWCOUNT => 365))
)
SELECT
   calendar_date,
   YEAR(calendar_date) AS year,
   MONTH(calendar_date) AS month,
   MONTHNAME(calendar_date) AS month_name,
   DAY(calendar_date) AS day,
   DAYOFWEEK(calendar_date) AS day_of_week,
   DAYNAME(calendar_date) AS day_name,
   CASE
       WHEN DAYOFWEEK(calendar_date) IN (0, 6) THEN TRUE
       ELSE FALSE
   END AS is_weekend,
   QUARTER(calendar_date) AS quarter
FROM date_dimension
WHERE calendar_date <= '2023-03-31'
ORDER BY calendar_date
LIMIT 10;

Giải thích: Truy vấn này:

  1. Dùng DATEADD với bộ sinh chuỗi để tạo dãy ngày cho năm 2023
  2. Trích xuất các thuộc tính ngày hữu ích cho mỗi ngày
  3. Lọc tới quý 1/2023 và hiển thị 10 ngày đầu để gọn

Kết quả:

Kết quả truy vấn Snowflake sử dụng hàm DATEADD

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 time
SELECT
   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()
ORDER BY event_timestamp;

Giải thích: Truy vấn này:

  1. Tìm các sự kiện sắp diễn ra (trong tương lai)
  2. Tính thời điểm nên bắt đầu chuẩn bị (3 ngày trước sự kiện)
  3. Tính thời điểm kết thúc dựa trên thời lượng sự kiện
  4. 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 subscriptions
WITH 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
   CROSS JOIN (SELECT seq4() AS seq FROM TABLE(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) + 1 AS days_in_period
FROM billing_periods
ORDER BY subscription_id, billing_period_number;

Giải thích: Truy vấn này:

  1. 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())
  2. 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)
  3. 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)
  4. Đếm số ngày trong mỗi kỳ thanh toán bằng DATEDIFF('DAY', billing_period_start, billing_period_end) + 1 Cộ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
  5. Chỉ lọc các đăng ký theo tháng với mệnh đề WHERE
  6. Sắp xếp theo subscription_id và số thứ tự kỳ để hiển thị hợp lý

Kết quả:

Kết quả truy vấn Snowflake sử dụng hàm DATEADD

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 functions
SELECT
   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;

Kết quả:

Kết quả truy vấn Snowflake sử dụng hàm DATEADD

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 scenario
SELECT
   -- 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
LIMIT 3;

Kết quả truy vấn Snowflake sử dụng hàm DATEADD

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 examples
SELECT
   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

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 transition
SELECT
   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

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 part
SELECT 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 numeric
SELECT 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 format
SELECT DATEADD(DAY, 1, '2023-01-15');       -- Correct: use YYYY-MM-DD format

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:

  1. Áp dụng DATEADD ở giai đoạn transform thay vì filter khi có thể.
  2. 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.
  3. 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.
  4. 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();

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ọ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.

Snowflake DATEADD FAQs

Hàm Snowflake DATEADD dùng để làm gì?

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.

Bexruz (Bex) Tuychiev

Tác giả

Bexruz (Bex) Tuychiev

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. 

Chủ đề

Liên quan