2016-07-05 11 views
-3

Dies ist meine Funktion FirstDayInQtrSelect-Anweisung MSSQL

Dies ist die SQL-Abfrage

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

, die diese Aussage erklären kann

+3

Ich bin sicher, wir könnten es alle erklären. Was genau ist deine Frage? Gibt es eine Ausgabe, die Sie nicht erwarten würden? Haben Sie es mit einigen Beispieldaten getestet, um zu sehen, was es tut? –

+0

ja ich habe es getestet und es funktioniert perfekt. aber ich kann die Logik hinter dieser Aussage nicht verstehen –

Antwort

0

Die DATEADD() Funktion addiert oder subtrahiert ein bestimmtes Zeitintervall von einem Datum.

Syntax: DATEADD (Datumsteil, Zahl, Datum)

qq = quarter, 

yy = Year 

in Ihrer Frage das Datumsfeld ist repräsentativ als 0 oder -1 in der Datumsteil Syntax, SQL Server bezieht 0 als 1900-1901 -01 00: 00: 00.000 und -1 als 1 Tag vor 0 1899.12.31 00: 00: 00.000

so

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) 

Jetzt wird 466 vom datediff(qq,0,GETDATE()) Abschnitt der Funktion abgeleitet. Laut Kalenderjahr gibt es zwischen 1900-01-01 00: 00: 00.000 466 Viertel und jetzt.

so in @day erhalten Sie 2016-07-01 00:00:00.000, wenn Ihr @InsertDate Wert 2016-07-05 00:00:00.000 ist.

1

Ich glaube, das Ihre Unsicherheiten wird klar: https://stackoverflow.com/a/3945396/6492765

Grundsätzlich ist SELECT eine T-SQL-Methode zum Festlegen eines Werts für eine Variable, wobei die Magie in selectin ist g aus Joins oder anderen ausgewählten Konzepten direkt in Variablen. Mit Zuweisung 1 Wert nur 1 Variable, unterscheidet es sich nicht von SET, die in Ihrem Fall wäre:

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

ordnen Sie den ersten Tag des laufenden Quartals auf variable @Day