Ottenere l’intervallo di date per il mese in corso?

Vorrei creare un’istruzione SQL per poi essere utilizzato nel mio codice, che ottiene l’intervallo di date per il mese corrente.

Esempio: Questo è il mese di agosto, in modo che l’intervallo di date da

StartDate = 08/01/11
EndDate = 08/31/11

tuttavia, se era il febbraio

StartDate = 02/01/11
EndDate = 02/28/11

Select * 
from mytable 
where (check_date >= StartDate) AND (check_date <= EndDate)

grazie per qualsiasi aiuto si può essere in grado di dare

Un problema con utilizzando l’ultimo giorno del mese, è che è necessario essere sicuri che check_date non si verifica mai oltre le 12 del mattino. Se è possibile, allora è meglio usare check_date < StartDateOfNextMonth.
Sono d’accordo. Potrei scrivere un libro bianco sul perché si dovrebbe utilizzare in esclusiva la fine di date, anziché inclusive end-date. In questo caso si finisce con >= 1st August AND < 1st September che è Molto più Facile da fare… (Nota: l’Utilizzo di questo formato significa che NON importa se il campo è sempre una DATA o, se possibile, un valore di tipo DATETIME, funziona in entrambi i casi…)

OriginaleL’autore IElite | 2011-08-24

4 risposte

  1. 11

    La si può trovare l’inizio di questo mese, con l’mesi-dal-zero trucco. L’ultimo giorno del mese è un mese più tardi, meno di un giorno:

    select  dateadd(month,datediff(month,0,getdate()),0)
    ,       dateadd(day,-1,dateadd(month,datediff(month,-1,getdate()),0))

    Stampa:

    1-aug-2011    31-aug-2011
    Stampa la data 2011-08-01 00:00:00.00, ma poi la data può essere convertita in qualsiasi formato desiderato.

    OriginaleL’autore Andomar

  2. 1

    Ho bisogno di molto simile cosa, per ottenere un mese di intervallo di date da una data specifica, che è stato possibile utilizzare in SQL la ricerca – che non sono solo le date devono essere corrette, ma il tempo deve essere da 00:00:00 a 23:59:59 se in 24 ore, ma è solo una questione di visualizzazione del formato di data e ora, funziona con 12 ore di sistema troppo.

    Forse sarà utile per qualcuno. Questa soluzione è basata su Andomar risposta:

    -- Parameter date, which must be given to this code
    DECLARE @date DATETIME
    SET @date = GETDATE() -- for testing purposes initializing some date
    
    -- Declare @from and to date range variables
    DECLARE @from DATETIME
    DECLARE @to DATETIME
    
    -- This code line is based on Andomar's answer
    SET @from = DATEADD(month,DATEDIFF(month, 0, @date),0) 
    
    -- Just simply to variable @from adds 1 month, minus 1 second
    SET @to = DATEADD(second, -1, DATEADD(month, 1, @date))
    
    -- Result
    SELECT @from, @to

    Si otterrà il risultato come 2012.01.01 00:00:00 – 2012.01.31 23:59:59.

    OriginaleL’autore agira

  3. 0

    Se è necessario il mese di gamma solo per controllare se “check_date” appartiene ad un mese specifico, è forse possibile utilizzare una condizione come

    month(Check_date) = @Month and year(Check_date) = @Year
    Anche se più semplici, brevi, questo non significa che si ottiene la scansione della tabella piuttosto che indice cerca (Non SARGable). L’esecuzione di operazioni sul campo di essere cercato in genere distrugge tali prestazioni. (Codice Corto != Codice Efficiente)

    OriginaleL’autore mslliviu

  4. 0

    Si potrebbe creare una funzione che restituisce la data di fine per la data indicata.

    In modo che la funzione è possibile passare la data di inizio e sarà come questo

    WHEN(MONTH(@date) IN (1, 3, 5, 7, 8, 10, 12)) THEN 31
    WHEN(MONTH(@date) IN (4, 6, 9, 11)) THEN 30
    ELSE 
        CASE 
           WHEN (YEAR(@date) % 4 = 0
           AND YEAR(@date) % 100 != 0)
           OR (YEAR(@date) % 400  = 0)
           THEN 29
            ELSE 28
    END
    Raccomando fortemente di attuazione data di regole come queste, si basano sulla data di funzioni già implementate.
    +1 Perché fidarsi di librerie a quando si può fare da soli? xD
    Non so biblioteca, supporto per diversi calendari, ma questo funziona solo per l’ (proleptic) calendario Gregoriano. Se i vostri dati avviene per alcune calendario regionale (o anche solo Julian), non funziona come previsto.
    -1. Questo è sbagliato. Se il DB implementa le funzionalità necessarie, perché si basano su e farlo da soli? (Non reinventare la ruota.)

    OriginaleL’autore Vitor Furlanetti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *