SQL中的双冒号(::)表示法


Answers:


64

根据RDBMS的不同而有所不同,但如果我猜对了,那就是PostgreSQL,在这种情况下,::转换a.dc为日期类型为date

在其他口味...

在MS SQL Server 2000中:

对于返回表的内置用户定义函数,必须使用前导双冒号(::)指定函数名称,以将其与非内置用户定义函数区分开。还必须将其指定为没有数据库或所有者资格的单部分名称。例如:SELECT * FROM :: fn_helpcollat​​ions()b ..对于返回标量值的内置用户定义函数,必须将函数名称指定为单一名称(不指定数据库或所有者)。不要指定前导双冒号(::)。

在MS SQL Server 2005中:

返回表的UDF不再需要双冒号。

然而...

在授予架构,证书,终结点和其他一些安全对象的权限时,SQL Server 2005中需要使用双冒号。

以及...

使用用户定义类型时,必须使用双冒号语法调用该类型的静态方法。

资料来源:BOLKalen Delaney的博客


我在SQL 2008 MCTS练习考试中遇到了与UDF一起使用的这种语法,本书中没有提到它!感谢您的解释
索菲亚

24

在这种情况下,它强制转换为日期类型。::是类型转换,也可以表示为CAST(表达式AS类型)。


如果您确实知道这一点,那么也许您知道此脚本用于什么RDBMS?
Andriy M

在我看来像PostgreSQL。您知道语法相同的替代方法吗?
Michael Dean

我知道一些支持双冒号表示法的RDBMS,也知道其他一些具有这种支持的RDBMS INTERVAL。这是我见过的结合了两者的第一段代码。我只是好奇而已。谢谢回复。
Andriy M

10

这是一项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为type的强制转换date

IBM Informix Dynamic Server(IDS)可以那样工作-但结尾处的INTERVAL标记对IDS无效,因此,实际上这可能是另一个DBMS(可能是PostgreSQL)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.