Δεν είναι λίγες οι φορές που στα σεμινάρια που κάνω ειδικά στην T-SQL οι μαθητές μου με ρωτάνε για το πως να υπολογίσουν διάφορα πράγματα με τις ημερομηνίες.
Επίσης βλέπω αρκετούς να βασανίζονται στα queries που γράφουν για να κάνουν τους διάφορους υπολογισμούς με τρόπους χαοτικούς και δαπανηρούς στην εκτέλεση.
Για αυτό το λόγο σε αυτό το μικρό άρθρο σας παραθέτω το πως μπορείτε να υπολογίσετε γρήγορα και με σχεδόν μηδενικό κόστος τις δημοφιλέστερες ερωτήσεις με τις ημερομηνίες
declare @givendate datetime = GETDATE();
-- all sql server versions
select @givendate as CurrentDate
, (YEAR(@givendate) * 100 ) + MONTH(@givendate) as YYYYMM; -- return type int
-- before sql server 2012
select @givendate as CurrentDate
, DATEADD(MONTH,DATEDIFF(MONTH,0, @givendate),0) as FirstDayCurrentMonth
, DATEADD(DAY,-1, DATEADD(MONTH,DATEDIFF(MONTH,0,@givendate)+1,0)) as LastDayCurrentMonth
, DATEADD(MONTH,DATEDIFF(MONTH,0,@givendate)-1,0) as FirstDayPreviousMonth
, DATEADD(DAY,-(DAY(@givendate)),@givendate) as LastDayPreviousMonth
, DATEADD(MONTH,DATEDIFF(MONTH,0,@givendate)+1,0) as FirstDayNextMonth
, DATEADD(DAY,-1 , DATEADD(MONTH,DATEDIFF(MONTH,0,@givendate)+2,0)) as LastDayNextMonth;
-- sql server 2012 and above
select @givendate as CurrentDate
, DATEADD(DAY,1,EOMONTH(@givendate,-1)) as FirstDayCurrentMonth
, EOMONTH(@givendate) as LastDayCurrentMonth
, DATEADD(DAY,1,EOMONTH(@givendate,-2)) as FirstDayPreviousMonth
, EOMONTH(@givendate,-1) as LastDayPreviousMonth
, DATEADD(DAY,1,EOMONTH(@givendate)) as FirstDayNextMonth
, EOMONTH(@givendate,1) as LastDayNextMonth;
-- all sql server versions
select @givendate as CurrentDate
, DATEADD(YEAR,DATEDIFF(YEAR,'19000101',@givendate),'19000101') as FirstDayCurrentYear
, DATEADD(DAY,-1, DATEADD(YEAR,DATEDIFF(YEAR,'19000101',@givendate)+1,'19000101')) as LastDayCurrentYear
, DATEADD(YEAR,DATEDIFF(YEAR,'19000101',@givendate)-1,'19000101') as FirstDayPreviousYear
, DATEADD(DAY,-1, DATEADD(YEAR,DATEDIFF(YEAR,'19000101',@givendate),'19000101')) as LastDayPreviousYear
, DATEADD(YEAR,DATEDIFF(YEAR,'19000101',@givendate)+1,'19000101') as FirstDayNextYear
, DATEADD(DAY,-1, DATEADD(YEAR,DATEDIFF(YEAR,'19000101',@givendate)+2,'19000101')) as LastDayNextYear;
-- all sql server versions
select @givendate as CurrentDate
, DATEADD(SECOND,(60*60*24)-1,DATEADD(DAY,0,DATEDIFF(DAY,0,@givendate))) as MidnightToday
, DATEADD(SECOND,(60*60*24)-1,DATEADD(DAY,-1,DATEDIFF(DAY,0,@givendate))) as MidnightYesterday
, DATEADD(SECOND,(60*60*24)-1,DATEADD(DAY,1,DATEDIFF(DAY,0,@givendate))) as MidnightTommorow
, DATEADD(HOUR,12,DATEADD(DAY,0,DATEDIFF(DAY,0,@givendate))) as NoonToday
, DATEADD(HOUR,12,DATEADD(DAY,-1,DATEDIFF(DAY,0,@givendate))) as NoonYesterday
, DATEADD(HOUR,12,DATEADD(DAY,1,DATEDIFF(DAY,0,@givendate))) as NoonTommorow