SQL SERVER中的ROUND()函数有三个参数,请问这三个参数分别代表啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL SERVER中的ROUND()函数有三个参数,请问这三个参数分别代表啥?相关的知识,希望对你有一定的参考价值。

ROUND() 是两个参数
ROUND(A,B) A 代表是要用到得字段 B是保留的小数
下面看别人的例子
ROUND的格式:ROUND(p1,p2,p3),
其作用是取四舍四入值P1:要被四舍五入的数字P2:保留的小数位数P3:如果为0或不输入,则表示进P1进入四舍五入,如ROUND(123.86,1) =123.90 如果P3是不为0的数,则对P1进行截断,可以理解为不四舍五入 ROUND(123.86,1,1)=123.80
参考技术A ROUND()函数有两个参数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name
参数 描述
column_name 必需。 要舍入的字段。
decimals 必需。 规定要返回的小数位数。
参考技术B 差点被误导了,发布以下标准答案:
ROUND(X): 返回参数X的四舍五入的一个整数。
mysql> select ROUND(-1.23);
-> -1
mysql> select ROUND(-1.58);
-> -2
mysql> select ROUND(1.58);
-> 2
ROUND(X,D): 返回参数X的四舍五入的有 D 位小数的一个数字。如果D为0,结果将没有小数点或小数部分。
mysql> select ROUND(1.298, 1);
-> 1.3
mysql> select ROUND(1.298, 0);
-> 1

(原)SQL Server 系统提供功能的三个疑惑

 
正文:
1、SQL Server系统提供的部分疑惑概述
 
近来工作之余一直在系统地学习和研究SQL Server 数据库引擎这一整块,发现了一些原来没有太注意的东西,感觉SQL Server 光数据库引擎这块就有很多要学习和研究的。我个人觉得SQL Server提供的功能除了bug(可以通过service pack打补丁修复)外,应该还是很值得信赖的。以下发现了如下SQL Server 系统提供功能的三个疑惑:系统函数调用时DEFAULT代替可选参数使用不一致、队列字段列message_enqueue_time记录的是UTC时间和@@Pack_Received系统函数提示信息有错误,以下针对每一个疑惑具体演示和讲解。

2、系统函数调用时DEFAULT代替可选参数使用不统一
 
DEFAULT关键字即可以在DDL语句中定义DEFAULT默认约束,也可以用来代替可选参数来使用。在DEFAULT代替可选参数使用这一点上,在功能上和NULL具有相同的效果。
 
在SQL Server系统提供的动态管理对象中,尤其动态管理函数的调用时,将可选参数代替为NULL或DEFAULT效果一样的。如下T-SQL代码:
SELECT *
FROM [sys].[dm_db_index_physical_stats](NULL, NULL, NULL, NULL, NULL);
GO
 
SELECT *
FROM [sys].[dm_db_index_physical_stats](DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
GO

 

针对以上T-SQL的测试结果如下截图:
技术分享
 技术分享
 
其他类型的系统函数,有些函数在可选参数代替NULL或DEFAULT效果也是一样的,有fn_trace_getinfo、fn_trace_gettable等。如以下T-SQL代码:
 
DECLARE @nvcDefaultTraceFilePath AS NVARCHAR(4000);
SET @nvcDefaultTraceFilePath = N‘‘;
 
SELECT @nvcDefaultTraceFilePath = [path]
FROM [sys].[traces]
WHERE [id] = 1;
 
SELECT *
FROM ::fn_trace_gettable(@nvcDefaultTraceFilePath, NULL);
 
SELECT *
FROM ::fn_trace_gettable(@nvcDefaultTraceFilePath, DEFAULT);
GO

 

针对以上T-SQL的测试结果如下截图:
技术分享
 技术分享
在其他类型系统函数中,更多的时候在可选参数代替NULL或DEFAULT在效果上是不一样的,有fn_virtualfilestats等。如下T-SQL代码:
SELECT *
FROM ::fn_virtualfilestats(1, NULL);
 
SELECT *
FROM ::fn_virtualfilestats(1, DEFAULT);

 

针对以上T-SQL测试的结果如下截图:
技术分享
技术分享
 
3、队列字段列message_enqueue_time记录的是UTC日期时间
 
学习和研究service broker时,发现了从服务队列中字段列message_enqueue_time值缺失UTC日期时间。
 
在系统数据库tempdb中演示获取创建表的事件通知的效果。如下T-SQL代码:
USE [tempdb];
GO
 
-- 创建队列
IF OBJECT_ID(N[dbo].[NotifyQueue], SQ) IS NULL
BEGIN
    CREATE QUEUE [dbo].[NotifyQueue]
    WITH
        STATUS = ON
       ,RETENTION = OFF
END
GO
 
-- 创建服务
IF NOT EXISTS (SELECT 1 FROM [sys].[services] WHERE [name] = NEventNotifyService) 
BEGIN
    CREATE SERVICE [EventNotifyService]
    ON QUEUE [dbo].[NotifyQueue] ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
END
GO
 
-- 创建路由
IF NOT EXISTS (SELECT 1 FROM [sys].[routes] WHERE [name] = NNotifyRoute)
BEGIN
    CREATE ROUTE [NotifyRoute]
    WITH 
        SERVICE_NAME = NEventNotifyService
       ,ADDRESS = NLOCAL;
END
GO
 
-- 创建事件通知
IF NOT EXISTS (SELECT 1 FROM [sys].[event_notifications] WHERE [name] = NCreateTableNotification)
BEGIN
    CREATE EVENT NOTIFICATION [CreateTableNotification]
    ON DATABASE
    FOR CREATE_TABLE
    TO SERVICE EventNotifyService, current database;
END
GO

 

创建表的 T-SQL脚本如下:
IF OBJECT_ID(N[dbo].[TableCreate], U) IS NULL
BEGIN
    CREATE TABLE [dbo].TableCreate
    (
        Col1 INT
        ,Col2 VARCHAR(100)
        ,Col3 XML
    )
    ON [PRIMARY]
END
GO

 

从刚才创建的服务队列中获取列表的T-SQL代码如下:
SELECT 
    CAST([message_body] AS XML)
    ,message_enqueue_time
    ,*
FROM [dbo].NotifyQueue
GO

 

针对以上T-SQL测试的如下图:
技术分享
技术分享
 
以上截图中两个红色矩形框圈住的地方,显然日期时间相差很大的,这是因为队列中的字段列message_enqueue_time记录的是UTC日期时间,这样就可能对展示造成迷惑的。
 
注意:
以上演示的T-SQL代码很大部分摘录于SQL Server 2012 管理高级教程(第2版)中第12章12.4.4事件通知小节中的程序清单 12-3 CreateQueue.sql。
 
4、@@Pack_Received系统函数提示有错误
 
在逐个梳理SQL Server系统提供的系统函数时发现了@@Pack_Received和@@Packet_Errors具有相同的提示信息。可以确定一定有一个是错误的。提示信息的演示如截图:
技术分享
技术分享
技术分享
技术分享
 
5、总结语
 
近来整体概要地了解和学习了SQL Server 数据库引擎这块的知识,感觉还是要继续深入学习 和研究。在深入过程中发现了以上SQL Server系统提供功能的3个疑惑。针对系统函数调用时DEFAULT代替可选参数不统一的疑惑尽量使用NULL,少用DEFAULT。针对服务队列中字段列message_enqueue_time为何保存UTC日期时间目前依然不明白,研究了很多sql server系统数据库、示例数据库很少使用UTC日期时间值的,也请知道的同仁告知,万分感谢。
 
很久很久没有更新博文了,主要原因还是太懒,读、写和说都是必备的基本技能的,写和说这两个基本技能继续提升加强。今晚正好元宵节,也祝福各位元宵节快乐,阖家欢乐。新的一年从今天开始,继续踏上征程:撸起袖子加油干。

6、参考清单列表
1、SQL Server 2012 管理高级教程(第2版)中第12章12.4.4事件通知小节中的程序清单 12-3 CreateQueue.sql。
 
 

以上是关于SQL SERVER中的ROUND()函数有三个参数,请问这三个参数分别代表啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中创建用户定义的 ROUND 函数

与以前的 SQL Server 版本相比,ROUND 函数返回不同的结果 SQL Server 2016

SQL ROUND函数的使用

SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数

sql server 数值的四舍五入

SQL Server 时间函数---CONVERT() 函数