Skip to content

sql-datatype-functions

在 SQL 中,数据类型函数对于操作和转换数据类型至关重要。为此目的最基本和广泛使用的函数是 CAST 和 CONVERT。掌握它们对于处理来自各种来源的数据、格式化输出和执行计算至关重要。

CAST 是 ANSI SQL 标准函数,用于将值从一种数据类型转换为另一种数据类型。因为它属于标准,所以它是 PostgreSQL、SQL Server、MySQL 和 Oracle 等不同数据库系统中最具可移植性且推荐用于类型转换的函数。

CAST (expression AS data_type)
  • expression: 您想要转换的值或列(例如,‘2023-12-25’,123.45,‘500’)。
  • data_type: 您想要转换成的目标 SQL 数据类型(例如,DATE,INT,DECIMAL(10,2))。
  1. 将字符串转换为数字: 这在数字数据存储为文本时很常见。
SELECT CAST('123' AS INT) + 10; -- 结果:133
  1. 将字符串转换为日期: 处理日期格式的文本时必不可少。
SELECT CAST('2024-01-15' AS DATE); -- 结果:表示 2024 年 1 月 15 日的日期值
  1. 将数字转换为字符串: 用于字符串连接。
SELECT 'Order ID: ' || CAST(404 AS VARCHAR(10)); -- 结果:'Order ID: 404' (注意:|| 是标准连接运算符)
  1. 截断小数: 将小数转换为整数会截断小数部分。
SELECT CAST(99.99 AS INT); -- 结果:99

CONVERT 是另一个广泛使用的函数,在 SQL Server 中尤其突出。虽然它可以执行与 CAST 相同的类型转换,但其主要优点是可选的第三个参数,用于基于样式的格式化,特别是针对日期和时间。

-- 通用转换
CONVERT (data_type, expression)
-- 基于样式的转换(主要在 SQL Server 中)
CONVERT (data_type, expression, style_code)

在 SQL Server 中,您可以使用样式代码将日期格式化为各种字符串表示形式。例如,要以 dd/mm/yyyy 格式获取日期:

-- SQL Server 特定示例
SELECT CONVERT(VARCHAR, GETDATE(), 103); -- 结果:'25/12/2023'(如果今天是圣诞节)

最佳实践: 鉴于其可移植性,对于标准类型转换,请优先使用 CAST。当您需要 CONVERT 在支持它的数据库(如 SQL Server)中的特定格式化功能时,再使用它。

除了转换之外,SQL 还提供了丰富的函数集来处理特定的数据类型。

  • LENGTH() 或 LEN(): 返回字符串中的字符数。
  • UPPER() / LOWER(): 将字符串转换为大写或小写。
  • SUBSTRING() 或 SUBSTR(): 提取字符串的一部分。
  • TRIM(): 移除字符串开头和结尾的空白字符。
  • ROUND(number, precision): 将数字四舍五入到指定的小数位数。
  • CEILING(number): 将数字向上舍入到最接近的整数。
  • FLOOR(number): 将数字向下舍入到最接近的整数。
  • ABS(number): 返回数字的绝对值(非负值)。
  • NOW() 或 GETDATE() 或 CURRENT_TIMESTAMP: 返回当前数据库服务器的日期和时间。
  • EXTRACT(part FROM date) 或 DATE_PART('part', date): 从日期中提取特定部分(年、月、日等)。

一些函数提供高度特定的信息,通常与特定的数据库系统相关联。这些函数在通用应用程序开发中较少使用,但对于管理或诊断任务可能很有用。

函数描述与用例
SQL_VARIANT_PROPERTY()SQL Server 特有。返回有关 sql_variant 值的信息,这是一种可以保存各种类型数据的特殊类型。在现代设计中,通常不鼓励使用它,而推荐使用明确的类型。
IDENT_CURRENT(), IDENT_INCR(), IDENT_SEED()SQL Server 特有。这些函数返回有关 IDENTITY 列(自增键)的元数据:当前标识值、增量步长和初始种子值。它们用于检查表定义。
DATALENGTH()SQL Server 特有。返回用于表示表达式的字节数。这与 LEN() 不同,LEN() 返回字符数。它对于诊断 NVARCHAR 等可变长度数据类型的存储问题很有用。