标签归档:sql函数

mssql sqlserver获取指定月份当月天数总和


摘要:
下文通过sql函数的形式,获取指定月份的总天数
实验环境:sqlserver 2008 R2

制作思路:
1. 获取指定月份的第一天,
2. 并采用dateadd向后加一个月形成一个新的日期
3. 将两个日期相减,并返回之间的相差天数,作为指定月份的总天数,如下所示:

  CREATE FUNCTION dbo.fn_getMonthDayAll    ---自定义函数名称
   (
	@yyyyMM VARCHAR(20)   ---指定输入参数格式 4位年份2位月份
   )
   RETURNS INT   ---函数返回值类型
   AS
  BEGIN
	DECLARE @dayAll INT
	DECLARE @monthStartDay DATETIME
	SET @monthStartDay =LEFT(@yyyyMM,4)+'-'+RIGHT(@yyyyMM,2)+'-01'
	SELECT @dayAll= DATEDIFF(DAY,@monthStartDay,DATEADD(MONTH,1,@monthStartDay))  ---获取指定月份总天数
	RETURN @dayAll;
  END
  GO

  SELECT dbo.Fun_GetMonthDays('201804'),
         dbo.Fun_GetMonthDays('201808');
      ---测试获取月份总天数函数

mssql sqlserver 字符串采用特殊字符分隔的方法分享(sql版的split函数)


摘要:
由于我们存储数据时,常喜欢将数据按照一定的格式进行叠加,然后存储在数据库中,使用数据时,希望使用行集数据进行使用,下文将讲述sql版的字符串分隔函数的使用方法
实验环境:sqlserver 2008


常见的数据表中合并数据格式如下:
1005,8888,1009,1020,
用户希望输入 以上字符串和分隔字符逗号,返回”表格数据”。
———————————————————-
由于sqlserver 2008版本中,没有原生态的split分隔函数(sqlserver 2016版本中有string_split函数),
我们需使用自定义函数,制作字符串分隔函数,达到数据分隔的目的,如下所示:

   drop function  [dbo].[sqlServerSplit] 
go

/*
创建自定义字符串分隔函数
使用 charindex substring 函数完成此功能的编写
*/
CREATE FUNCTION [dbo].[sqlServerSplit] 
( 
@inputInfo  nvarchar(800),  
@splitString nvarchar(8) 
)
RETURNS @tmp TABLE(outPutInfo nvarchar(500)) 
AS
BEGIN
-- 定义临时变量
DECLARE @tmpI int,@tempInput nvarchar(500) 
SET @tmpI=CHARINDEX(@splitString,@inputInfo)   ---获取当前字符串中分隔字符串的起始位置

WHILE(@tmpI<>0) 
BEGIN

        SET @tempInput = SUBSTRING(@inputInfo,1,@tmpI-1)  
        
        INSERT INTO @tmp(outPutInfo) VALUES(@tempInput)  

        SET @inputInfo = SUBSTRING(@inputInfo,@tmpI+1,LEN(@inputInfo)-@tmpI) 
        SET @tmpI=CHARINDEX(@splitString,@inputInfo)  
 END  
    
    /*分隔字符串最后位置数据插入*/
    SET @tempInput = @inputInfo 
    IF (LEN(@tempInput)>0) 
        INSERT INTO @tmp(outPutInfo) VALUES(@inputInfo)  
        

RETURN

END

GO


---函数测试:

SELECT * FROM dbo.[sqlServerSplit](N'猫猫,maomao365,猫猫小屋,这是一个blog,sqlserver教程网,sqlserver技巧网,',',')
 

mssql sqlserver DATEDIFF 日期时间差值计算函数使用说明


摘要:
下文主要讲述 DATEDIFF 系统函数的使用说明,
实验环境:
sqlserver 2000
如下所示:



DATEDIFF 语法及功能简介

DATEDIFF 功能说明:
返回两个日期之间的差值,并将差值采用分钟、小时、天、年等形式返回。
———————-
DATEDIFF 语法说明:
DATEDIFF(datepart,startdate,enddate)
参数说明:
datepart:

参数名称 参数缩写 参数说明
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw, w
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns

startdate、enddate:
此处表达式需为一个time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 类型的值,
如果输入的为字符串,那么字符串一定要能转换为日期类型
————————–
DATEDIFF 返回值说明:
int

注意事项:
返回指定的 startdate 和 enddate 之间差,并按照datepart规定的类型转换为int。
当返回值超过int的最大数据范围,则返回相应的错误信息



DATEDIFF 举例说明

 --例1:
SELECT DATEDIFF(year, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2018-10-12 23:59:59.9999999', '2017-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2018-10-12 23:59:59.9999999', '2018-10-01 00:00:00.0000000');

--例2:在表中进行相关计算
  CREATE TABLE dbo.test  
    (  
    a datetime2  
    ,b datetime2  
    );  
INSERT INTO dbo.test(a,b)  
    VALUES('2018-05-06 10:09:09','2018-05-07 10:09:09');  
SELECT DATEDIFF(day,a,b) AS '间隔天数'  
FROM dbo.test   
    go;
    drop table test 
    go