Dấu hai chấm (: :) ký hiệu trong SQL


84

Đã nhặt được mã của ai đó và đây là một phần của mệnh đề where, có ai biết dấu hai chấm cho biết gì không?

b.date_completed >  a.dc::date + INTERVAL '1 DAY 7:20:00'


Câu trả lời:


64

Nó thay đổi dựa trên RDBMS, nhưng nếu tôi đoán đúng, đó là PostgreSQL, trong trường hợp đó, nó ::chuyển đổi a.dcthành kiểu ngày tháng date.

Trong các hương vị khác ...

Trong MS SQL Server 2000:

Đối với các hàm do người dùng định nghĩa dựng sẵn trả về một bảng, tên hàm phải được chỉ định bằng dấu hai chấm kép ở đầu (: :) để phân biệt với các hàm do người dùng định nghĩa không được tích hợp sẵn. Nó cũng phải được chỉ định là tên một phần không có cơ sở dữ liệu hoặc trình độ chủ sở hữu. Ví dụ: SELECT * FROM :: fn_helpcollations () b .. Đối với các hàm cài sẵn do người dùng định nghĩa trả về giá trị vô hướng, tên hàm phải được chỉ định là tên một phần (không chỉ định cơ sở dữ liệu hoặc chủ sở hữu). Không chỉ định dấu hai chấm ở đầu (: :).

Trong MS SQL Server 2005:

Dấu hai chấm không còn bắt buộc đối với các UDF trả về một bảng.

Tuy nhiên...

Dấu hai chấm là bắt buộc trong SQL Server 2005 khi cấp quyền trên lược đồ, chứng chỉ, điểm cuối và một số bảo mật khác.

Cũng như...

Khi sử dụng Kiểu do người dùng xác định, các phương thức tĩnh của kiểu phải được gọi bằng cú pháp dấu hai chấm.

Nguồn: BOLKalen Delaney's Blog


Tôi đã xem qua cú pháp này được sử dụng với UDF trong kỳ thi thực hành MCTS SQL 2008, nó không được đề cập ở bất kỳ đâu trong sách! Cảm ơn bạn đã giải thích
Sophia

24

Trong trường hợp này, nó là một kiểu truyền ngày tháng. :: là một kiểu ép kiểu cũng có thể được biểu diễn dưới dạng CAST (kiểu biểu thức AS).


Nếu bạn biết chắc chắn điều đó thì có thể bạn biết RDBMS tập lệnh này dùng để làm gì?
Andriy M

Có vẻ như PostgreSQL đối với tôi. Bạn có biết bất kỳ lựa chọn thay thế nào có cùng cú pháp không?
Michael Dean

Tôi biết một số RDBMS hỗ trợ ký hiệu dấu hai chấm và tôi biết một số khác có tính năng INTERVALhỗ trợ. Đây là đoạn mã đầu tiên tôi từng thấy kết hợp cả hai. Tôi chỉ là tò mò thôi. Cảm ơn vi đa trả lơi.
Andriy M

10

Nó là một CASThoạt động (ép kiểu ngày tháng).

Thí dụ:

SELECT now()::timestamp(0);

Tương đương với:

SELECT 
    CAST (now() AS timestamp(0));

Cả hai đều dẫn đến việc truyền now()sang timestampở định dạng sau:YYYY-MM-DD HH:MM:SS


Một ví dụ đơn giản khác có thể là : select 1.2::integer, sẽ xuất ra kết quả là 1.
themefield

0

Nó có lẽ là một diễn viên, chuyển đổi a.dcsang loại date.

Máy chủ động Informix của IBM (IDS) sẽ hoạt động theo cách đó - nhưng ký hiệu INTERVAL ở cuối không hợp lệ cho IDS, vì vậy có lẽ đây trên thực tế là một DBMS khác (có thể là PostgreSQL ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.