Обозначение двойного двоеточия (: :) в SQL

90

Подобрали чей-то код, и это часть предложения where, кто-нибудь знает, что обозначает двойное двоеточие?

b.date_completed >  a.dc::date + INTERVAL '1 DAY 7:20:00'
Пэт
источник

Ответы:

67

Это зависит от СУБД, но, если я правильно понимаю, это PostgreSQL, и в этом случае он ::преобразуется a.dcв тип даты date.

В других вкусах ...

В MS SQL Server 2000:

Для встроенных пользовательских функций, возвращающих таблицу, имя функции должно быть указано с начальным двойным двоеточием (: :), чтобы отличать его от пользовательских функций, которые не являются встроенными. Оно также должно быть указано как одночастное имя без указания базы данных или владельца. Например: SELECT * FROM :: fn_helpcollations () b .. Для встроенных пользовательских функций, возвращающих скалярное значение, имя функции должно быть указано как одночастное имя (не указывайте базу данных или владельца). Не указывайте в начале двойное двоеточие (: :).

В MS SQL Server 2005:

Двойные двоеточия больше не требуются для UDF, возвращающих таблицу.

Тем не мение...

Двойные двоеточия требуются в SQL Server 2005 при предоставлении разрешений на схемы, сертификаты, конечные точки и некоторые другие защищаемые объекты.

Так же как...

При использовании типов, определяемых пользователем, статические методы типа должны вызываться с использованием синтаксиса с двойным двоеточием.

Источники: BOL и блог Калена Делани.

Майкл Фредриксон
источник
Я столкнулся с этим синтаксисом, используемым с UDF на практическом экзамене MCTS по SQL 2008, он нигде не упоминается в книге! Спасибо за объяснение
София
27

В данном случае это приведение к типу даты. :: - это приведение типа, которое также может быть представлено как CAST (выражение типа AS).

Майкл Дин
источник
Если вы знаете это наверняка, то, может быть, вы знаете, для какой СУБД предназначен этот скрипт?
Andriy M
Мне кажется, это PostgreSQL. Знаете ли вы какие-либо альтернативы с таким же синтаксисом?
Майкл Дин
Я знаю некоторые СУБД, поддерживающие нотацию с двойным двоеточием, и я знаю некоторые другие, которые имеют такую INTERVALподдержку. Это первая часть кода, которую я когда-либо видел, которая сочетает в себе и то, и другое. Мне просто было любопытно. Спасибо за ответ.
Andriy M
14

Это CASTоперация (приведенная к типу даты).

Пример:

SELECT now()::timestamp(0);

Эквивалентно:

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

Они оба результата в кастинге , now()чтобы timestampв следующем формате:YYYY-MM-DD HH:MM:SS

теккуз
источник
Другой простой пример:, select 1.2::integerкоторый выведет результат как 1.
themefield
0

Вероятно, это приведение a.dcк типу date.

IBM Informix Dynamic Server (IDS) будет работать таким образом, но обозначение INTERVAL в конце недопустимо для IDS, поэтому, по-видимому, это на самом деле другая СУБД (вероятно, PostgreSQL ).

Джонатан Леффлер
источник