2016-07-05 2 views
-3

Это моя функция FirstDayInQtrВыберите оператор MSSQL

Это SQL-запрос

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

, который может объяснить это утверждение

+3

Я уверен, что мы все могли это объяснить. Что же такое ваш вопрос? Это дает результат, которого вы не ожидаете? Пробовали ли вы его с некоторыми примерами данных, чтобы узнать, что он делает? –

+0

да, я тестировал его, и он отлично работает. но я не могу понять логику этого утверждения –

ответ

0

DATEADD() В функция добавляет или вычитает указанный интервал времени с даты.

Синтаксис: DATEADD (DatePart, номер, дата)

qq = quarter, 

yy = Year 

в вашем вопросе поле даты является представителем как 0 или -1 в синтаксисе DATEPART, 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.000 существует 466 кв.

поэтому в @day u получит 2016-07-01 00:00:00.000, если ваше значение @InsertDate равно 2016-07-05 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