Come ottenere la prima e l'ultima data dell'anno in corso?


110

Utilizzando SQL Server 2000, come posso ottenere la prima e l'ultima data dell'anno in corso?

Uscita prevista:

01/01/2012 e 31/12/2012

Risposte:


237
SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

La query precedente fornisce un valore datetime per la mezzanotte all'inizio del 31 dicembre. Questo è circa 24 ore in meno dell'ultimo momento dell'anno. Se vuoi includere il tempo che potrebbe verificarsi il 31 dicembre, dovresti confrontare con il primo dell'anno successivo, con un <confronto. Oppure puoi confrontare con gli ultimi millisecondi dell'anno in corso, ma questo lascia ancora un divario se stai usando qualcosa di diverso da DATETIME (come DATETIME2):

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
   DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear

Dettagli tecnici

Funziona calcolando il numero di anni dal 1900 con DATEDIFF(yy, 0, GETDATE())e quindi aggiungendolo a una data pari a zero = 1 gennaio 1900. Questo può essere modificato per funzionare per una data arbitraria sostituendo la GETDATE()parte o un anno arbitrario sostituendo la DATEDIFF(...)funzione con "Anno - 1900."

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015

13

Ecco un modo abbastanza semplice;

SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';

Non è sexy, ma funziona.


1
Disponibile solo a partire da Sql Server 2012.
Lukas

12

È possibile ottenere l'anno corrente utilizzando la DATEPARTfunzione, dalla data corrente ottenuta utilizzandogetUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))

1
Questo restituisce stringhe, non date. Se è ciò di cui hai veramente bisogno, sì, ma se puoi usarne uno, mantieni le date come date e non usarle come stringhe.
Jamie F

2
Non sono d'accordo, OP non ha specificato e il formato dati impostato nel server sql potrebbe restituire qualcosa come "2012-01-01 12:13:14" invece di "
01/01/2012

1
@ RandyMorris, d'accordo, l'OP stava chiedendo se può ottenere DATETIMEinvece di string e ovviamente questo potrebbe non corrispondere all'output previsto come da domanda.
Vikdor

1
Perché dovresti usare un formato di data ambiguo (e le stringhe nella tua risposta non corrispondono al formato nel tuo commento)? yyyyMMddè inequivocabile.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, la query nella risposta deve corrispondere all'output previsto come da domanda. Il commento su DATETIME è una risposta al commento di OP su come ottenere la data invece della stringa. La risposta non riflette questa discussione.
Vikdor

7

scrivi semplicemente: -

select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))

data di inizio dell'anno.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  

4

Ogni anno ha il 1 ° come Primo appuntamento e 31 come ultima data, ciò che devi fare è solo allegare l'anno a quel giorno e mese, ad esempio: -

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]

1
Questo non è necessariamente vero, poiché ci sono molte falsità che i programmatori credono sul tempo .
krillgar

Qualcuno potrebbe fornire un esempio di quando questo non funzionerà?
slayernoah

@slayernoah A seconda delle impostazioni di localizzazione del server, penso che a volte questo generi un errore.
Jamie F

3

Per ottenere il primo e l'ultimo giorno dell'anno, è possibile utilizzare la CONCATfunzione. Il valore risultante può essere convertito in qualsiasi tipo.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear

Year non funziona per me, ma date_part funziona start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat

1

Per la data di inizio dell'anno in corso:

SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())

Per la data di fine dell'anno in corso:

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))

1

Un altro modo: (da SQL Server 2012)

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay

0

Dai un'occhiata a questo:

select convert(varchar(12),(DateAdd(month,(Month(getdate())-1) * -1, DateAdd(Day,(Day(getdate())-1) * -1,getdate()))),103) as StartYear,
       convert(varchar(12),DateAdd(month,12 - Month(getdate()), DateAdd(Day,(31 - Day(getdate())),getdate())),103) as EndYear


0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)

Dovresti spiegare il tuo codice. I dump del codice vengono spesso sottovalutati e possono essere eliminati.
Bugs

0

Sembra che tu sia interessante nell'eseguire un'operazione tutto per un dato anno, se questo è davvero il caso, consiglierei di usare la funzione ANNO () in questo modo:

SELECT * FROM `table` WHERE YEAR(date_column) = '2012';

Lo stesso vale per DAY () e MONTH () . Sono disponibili anche per le varianti MySQL / MariaDB ed è stato introdotto in SQL Server 2008 (quindi non per il 2000 specifico).


-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual

Questo è per PL-SQL, il post dice SQL Server 2000, quindi devi usare T-SQL. To_Date e Sysdate non esistono in T-SQL
Andrew Failor

-1

In Microsoft SQL Server (T-SQL) questo può essere fatto come segue

--beginning of year
select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

--end of year
select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

CURRENT_TIMESTAMP - restituisce la data del server sql al momento dell'esecuzione della query.

ANNO : ottiene la parte relativa all'anno del timestamp corrente.

STR , LTRIM : queste due funzioni vengono applicate in modo che possiamo convertirlo in un varchar che può essere concatinato con il nostro prefisso desiderato (in questo caso è la prima data dell'anno o l'ultima data dell'anno). Per qualsiasi motivo il risultato generato dalla funzione ANNO ha spazi di prefisso. Per risolverli usiamo il file funzione LTRIM che è left trim.


-1

Se raggiunge il 1 ° gennaio potrebbe essere ancora la data degli ultimi anni.

select
convert(date, DATEADD(yy, DATEDIFF(yy, 0,  DATEadd(day, -1,getdate())), 0), 103 ) AS StartOfYear,
convert(date, DATEADD(yy, DATEDIFF(yy, 0, DATEDIFF(day, -1,getdate()))+1, -1), 103 )AS EndOfYear

-2

Prova questo:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')

Microsoft SQL Server. Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi

Questa risposta utilizza le funzioni di MySQL (e trasmette le date alle stringhe, che è uno dei miei problemi preferiti).
Álvaro González

-3

--- Lalmuni Demo ---

create table Users
(
userid int,date_of_birth date
)

--- inserire valori ---

insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.