Odpowiedzi:
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
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.
Możesz uzyskać bieżący rok za pomocą DATEPART
funkcji, od aktualnej daty uzyskanej za pomocągetUTCDate()
SELECT
'01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())),
'31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
DATETIME
zamiast ciągu i oczywiście może to nie odpowiadać oczekiwanemu wynikowi zgodnie z pytaniem.
yyyyMMdd
jest jednoznaczne.
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))
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]
Aby uzyskać pierwszy i ostatni dzień roku, można skorzystać z CONCAT
funkcji. Wynikowa wartość może być rzutowana na dowolny typ.
CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
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))
Inny sposób: (od SQL Server 2012)
SELECT
DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
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
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
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).
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31')
from dual
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.
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
Spróbuj tego:
DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')
Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
--- 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