go backsqlschool blogs list

Date and Time popular calculations

by Antonios Chatzipavlis

Δεν είναι λίγες οι φορές που στα σεμινάρια που κάνω ειδικά στην 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


//antonch


Ημερομηνία: 26 September 2017 16:47
Αξιολόγηση: ( 2 )
Κατηγορίες:
Tags:
Share it:

Σχετικά Blog Post

Αφήστε το σχόλιο σας - Leave your comment

Τα σχόλια έχουν κλείσει.
Επιτρέπονται μόνο τα σχόλια από τα μέλη του SqlSchool.gr.


newsletter subscription

Εάν επιθυμείτε να λαμβάνετε ενημέρωση από εμάς, δώστε μας το e-mail σας.
PASS chapter logo
Official Professional Association for SQL Server (PASS) chapter for Greece
Join to PASS