2016-07-05 150 views
-3

这是我的功能FirstDayInQtrSelect语句MSSQL

这是SQL查询

SELECT @day = DATEADD(qq, DATEDIFF(qq ,0, @InputDate),0) 

谁可以解释这一声明

+3

我确定我们都可以解释它。你的问题到底是什么?它给出了你不会期望的输出吗?您是否使用一些示例数据对其进行了测试,以了解其功能? –

+0

是的,我测试它,它完美的作品。但我无法理解这个陈述背后的逻辑 –

回答

0

DATEADD()函数从日期中添加或减去指定的时间间隔。

语法:DATEADD(日期部分,数字,日期)

qq = quarter, 

yy = Year 
在你的问题

日期字段是代表0或-1中的日期部分的语法, SQL服务器涉及0作为1900至01年-01 00:00:00.000和 -1作为前1天0 1899年12月31日00:00:00.000

所以

select dateadd(qq,466,'1900-01-01 00:00:00.000') is the same as 


SELECT DATEADD(qq, DATEDIFF(qq ,0, GETDATE()),0) 

OR 

SET @InsertDate = GETDATE() 

SELECT DATEADD(qq, DATEDIFF(qq ,0, @InsertDate),0) 

现在,466由该函数的datediff(qq,0,GETDATE())部分派生。根据日历年,在1900-01-01 00:00:00:00 和现在之间有466个quaters。如果您的@InsertDate值为2016-07-05 00:00:00.000,您将得到2016-07-01 00:00:00.000

1

我相信这会清除你的不确定性:https://stackoverflow.com/a/3945396/6492765

基本上,SELECT是一种为变量设置值的T-SQL方式,魔术在selectin g从连接或其他选择概念直接转换为变量。随着分配1个值只有1个变量,它不会从SET不同这,你的情况,应该是:

SET @day = DATEADD(qq, DATEDIFF(qq ,0, @InputDate),0) 
0

您当前季度的第一天分配给变量@day