Yanıtlar:
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Yukarıdaki sorgu, 31 Aralık'ın başındaki gece yarısı için bir tarih saat değeri verir. Bu, yılın son anından yaklaşık 24 saat kısadır. 31 Aralık'ta meydana gelebilecek zamanı da dahil etmek istiyorsanız, bir <
karşılaştırma yaparak gelecek yılın ilkiyle karşılaştırmalısınız. Veya mevcut yılın son birkaç milisaniyesiyle karşılaştırabilirsiniz, ancak DATETIME dışında bir şey kullanıyorsanız (DATETIME2 gibi) bu yine de bir boşluk bırakır:
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
Teknik Detaylar
Bu, 1900'den bu yana geçen yılların sayısını bulmak DATEDIFF(yy, 0, GETDATE())
ve ardından bunu sıfır tarihi = 1 Ocak 1900'e ekleyerek çalışır. Bu GETDATE()
, DATEDIFF(...)
işlevin yerine geçerek bölümü veya keyfi bir yılı değiştirerek keyfi bir tarih için çalışacak şekilde değiştirilebilir. "Yıl - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015
İşte oldukça basit bir yol;
SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';
Seksi değil ama işe yarıyor.
Mevcut yılı DATEPART
fonksiyonunu kullanarak elde edebilirsiniz.getUTCDate()
SELECT
'01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())),
'31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
DATETIME
dizge yerine alıp alamayacağını soruyordu ve açıkçası bu soruya göre beklenen çıktıyla eşleşmeyebilir.
yyyyMMdd
belirsiz değildir.
basitçe yazın: -
select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))
yılın başlangıç tarihi.
select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))
Her yıl, İlk tarih olarak 1. ve son tarih olarak 31. Yapmanız gereken, yalnızca yılı o güne ve aya eklemektir, örneğin: -
SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
'12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
Yılın ilk ve son gününü elde etmek için CONCAT
işlev kullanılabilir. Ortaya çıkan değer herhangi bir türe dönüştürülebilir.
CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
Mevcut yılın başlangıç tarihi için:
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
Mevcut yılın bitiş tarihi için:
SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))
Başka bir yol: (SQL Server 2012'den beri)
SELECT
DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
Şuna bir bak:
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)
Belirli bir yıl için her şeyi bir operasyon yapmakla ilgileniyormuşsunuz gibi görünüyor , eğer gerçekten durum buysa, YEAR () fonksiyonunu şu şekilde kullanmanızı tavsiye ederim :
SELECT * FROM `table` WHERE YEAR(date_column) = '2012';
Aynı şey DAY () ve AY () . Ayrıca MySQL / MariaDB varyantları için de mevcuttur ve SQL Server 2008'de tanıtılmıştır (bu nedenle belirli 2000'ler için geçerli değildir).
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31')
from dual
Microsoft SQL Server'da (T-SQL) bu şu şekilde yapılabilir
--beginning of year
select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))
--end of year
select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))
CURRENT_TIMESTAMP - sorgunun çalıştırıldığı andaki sql sunucu tarihini döndürür.
YEAR - geçerli zaman damgasının yıl bölümünü alır.
STR , LTRIM - bu iki işlev, bunu istediğimiz önekle birleştirilebilecek bir varchar'a dönüştürebilmemiz için uygulanır (bu durumda bu, yılın ilk tarihi veya yılın son tarihi). Hangi nedenle olursa olsun, YEAR işlevi tarafından oluşturulan sonuçta önek boşlukları vardır. Onları düzeltmek için sol trim olan LTRIM işlevini kullanıyoruz .
1 Ocak'a ulaşırsa, hala son yılların tarihi olabilir.
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
Bunu dene:
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.
--- Lalmuni Demoları ---
create table Users
(
userid int,date_of_birth date
)
--- değer girin ---
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