Jak uzyskać pierwszą i ostatnią datę bieżącego roku?

110

Korzystając z programu SQL Server 2000, jak mogę uzyskać pierwszą i ostatnią datę bieżącego roku?

Oczekiwany wynik:

01/01/2012 i 31/12/2012

Gopal
źródło

Odpowiedzi:

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

Powyższe zapytanie podaje wartość daty i godziny dla północy na początku 31 grudnia. To około 24 godziny przed ostatnią chwilą roku. Jeśli chcesz uwzględnić czas, który może mieć miejsce 31 grudnia, powinieneś porównać go z pierwszym dniem następnego roku, <porównując. Lub możesz porównać z kilkoma ostatnimi milisekundami bieżącego roku, ale nadal pozostawia to lukę, jeśli używasz czegoś innego niż DATETIME (na przykład 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

Szczegóły techniczne

Działa to poprzez obliczenie liczby lat od 1900 r., DATEDIFF(yy, 0, GETDATE())A następnie dodanie jej do daty zero = 1 stycznia 1900 r. Można to zmienić, aby działało dla dowolnej daty, zastępując GETDATE()część lub dowolny rok, zastępując DATEDIFF(...)funkcję „Rok - 1900”.

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015
Jamie F.
źródło
13

Oto dość prosty sposób;

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

To nie jest seksowne, ale działa.

Aubrey Love
źródło
1
Dostępne tylko od Sql Server 2012.
Lukas
12

Możesz uzyskać bieżący rok za pomocą DATEPARTfunkcji, od aktualnej daty uzyskanej za pomocągetUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
Vikdor
źródło
1
Wyprowadza ciągi, a nie daty. Jeśli tego naprawdę potrzebujesz, tak, ale jeśli możesz użyć jednego z nich, zachowaj daty jako daty i nie używaj ich jako ciągów.
Jamie F
2
Nie zgadzam się, OP nie określił i zestaw danych ustawionych na serwerze sql może zwracać coś takiego jak „2012-01-01 12:13:14” zamiast „01/01/2012”
RandyMorris
1
@RandyMorris, zgadzam się, OP pytał, czy może uzyskać DATETIMEzamiast ciągu i oczywiście może to nie odpowiadać oczekiwanemu wynikowi zgodnie z pytaniem.
Vikdor
1
Dlaczego miałbyś używać niejednoznacznego formatu daty (a ciągi znaków w Twojej odpowiedzi nie pasują do formatu w Twoim komentarzu)? yyyyMMddjest jednoznaczne.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever, zapytanie w odpowiedzi ma na celu dopasowanie oczekiwanego wyniku zgodnie z pytaniem. Komentarz dotyczący DATETIME jest odpowiedzią na komentarz OP dotyczący pobierania daty zamiast ciągu. Odpowiedź nie odzwierciedla tej dyskusji.
Vikdor,
7

po prostu napisz: -

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

data rozpoczęcia roku.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  
Pradeep atkari
źródło
4

Każdy rok ma pierwszą datę jako pierwszą i 31 jako ostatnią datę, co musisz zrobić, to tylko dołączyć rok do tego dnia i miesiąca, na przykład: -

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
Rahul Tripathi
źródło
1
Niekoniecznie jest to prawda, ponieważ programiści są przekonani o wielu fałszach dotyczących czasu .
krillgar,
Czy ktoś mógłby podać przykład, kiedy to nie zadziała?
slayernoah
@slayernoah W zależności od ustawień lokalizacji serwera, myślę, że czasami generuje to błąd.
Jamie F,
3

Aby uzyskać pierwszy i ostatni dzień roku, można skorzystać z CONCATfunkcji. Wynikowa wartość może być rzutowana na dowolny typ.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
Gayle
źródło
Rok nie działa dla mnie, ale date_part działa data_roku: = CONCAT (data_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat
1

Data rozpoczęcia bieżącego roku:

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

Na koniec bieżącego roku:

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))
DHANA LAKSHMI
źródło
1

Inny sposób: (od SQL Server 2012)

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
EstevaoLuis
źródło
0

Sprawdź ten:

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
Nigdy bez nadziei
źródło
0
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
DHANA LAKSHMI
źródło
0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
zadeveloper
źródło
Powinieneś wyjaśnić swój kod. Zrzuty kodu są często odrzucane i mogą zostać usunięte.
Błędy
0

Wygląda na to, że jesteś zainteresowany wykonaniem operacji wszystkiego na dany rok, jeśli tak jest, polecałbym użycie funkcji ROK () w następujący sposób:

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

To samo dotyczy DAY () i MONTH () . Są również dostępne dla wariantów MySQL / MariaDB i zostały wprowadzone w SQL Server 2008 (a więc nie dla określonego 2000).

chjortlund
źródło
-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual
R-Dubz
źródło
To jest dla PL-SQL, jak mówi post SQL Server 2000, więc musisz używać T-SQL. To_Date i Sysdate nie istnieją w T-SQL
Andrew Failor
-1

W Microsoft SQL Server (T-SQL) można to zrobić w następujący sposób

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

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

CURRENT_TIMESTAMP - zwraca datę serwera sql w momencie wykonania zapytania.

YEAR - pobiera część roku z bieżącego znacznika czasu.

STR , LTRIM - te dwie funkcje są stosowane, abyśmy mogli przekształcić to w varchar, który można połączyć z naszym żądanym przedrostkiem (w tym przypadku jest to pierwsza data roku lub ostatnia data roku). Z jakiegoś powodu wynik wygenerowany przez funkcję YEAR ma spacje przedrostków. Aby je naprawić, używamy funkcji LTRIM, która jest lewym przycięciem.

Soundararajan
źródło
-1

Jeśli dojdzie do 1 stycznia, może to być jeszcze data z zeszłego roku.

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
Nathan Lincoln
źródło
-2

Spróbuj tego:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')
Ivan
źródło
Microsoft SQL Server. Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi
Ta odpowiedź używa funkcji MySQL (i rzutuje daty na łańcuchy, co jest jednym z moich ulubionych irytujących).
Álvaro González
-3

--- Dema Lalmuni ---

create table Users
(
userid int,date_of_birth date
)

--- wstaw wartości ---

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
Lalmuni Singh
źródło