Обозначение двойного двоеточия (: :) в 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 ).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.