İçinde bulunduğumuz yılın ilk ve son tarihi nasıl alınır?


110

SQL Server 2000 kullanarak cari yılın ilk ve son tarihini nasıl alabilirim?

Beklenen çıktı:

01/01/2012 ve 31/12/2012

Yanıtlar:


237
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

13

İş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.


1
Yalnızca Sql Server 2012'den itibaren kullanılabilir.
Lukas

12

Mevcut yılı DATEPARTfonksiyonunu kullanarak elde edebilirsiniz.getUTCDate()

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

1
Bu, tarihleri ​​değil dizeleri çıkarır. Gerçekten ihtiyacınız olan şey buysa, yay, ama ikisini de kullanabiliyorsanız tarihleri ​​tarih olarak tutun ve onları dizge olarak kullanmayın.
Jamie F

2
Katılmıyorum, OP belirtmedi ve sql sunucusundaki veri formet seti '01 / 01/2012 'yerine' 2012-01-01 12:13:14 'gibi bir şey döndürebilir
RandyMorris

1
@RandyMorris, katılıyorum, OP DATETIMEdizge yerine alıp alamayacağını soruyordu ve açıkçası bu soruya göre beklenen çıktıyla eşleşmeyebilir.
Vikdor

1
Neden belirsiz bir tarih biçimi kullanasınız (ve cevabınızdaki dizeler yorumunuzdaki biçime uymuyor)? yyyyMMddbelirsiz değildir.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, yanıttaki sorgu, soruya göre beklenen çıktıyla eşleşmektir. DATETIME hakkındaki yorum, OP'nin dize yerine tarih alma hakkındaki yorumuna bir yanıttır. Cevap bu tartışmayı yansıtmıyor.
Vikdor

7

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))  

4

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]

1
Programcıların zaman hakkında inandıkları pek çok yalan olduğu için, bu mutlaka doğru değildir .
krillgar

Bunun ne zaman işe yaramayacağına dair bir örnek verebilir misiniz?
slayernoah

@slayernoah Sunucunun yerelleştirme ayarlarına bağlı olarak, bunun bazen bir hata oluşturacağını düşünüyorum.
Jamie F

3

Yılın ilk ve son gününü elde etmek için CONCATiş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

Yıl benim için çalışmıyor ama date_part çalışıyor start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat

1

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))

1

Başka bir yol: (SQL Server 2012'den beri)

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

0

Ş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


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

Kodunuzu açıklamalısınız. Kod dökümleri genellikle olumsuz oylanır ve silinebilir.
Hatalar

0

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).


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

Bu PL-SQL için, SQL Server 2000 yazıyor, bu yüzden T-SQL kullanmanız gerekiyor. To_Date ve Sysdate T-SQL'de mevcut değil
Andrew Failor

-1

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

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

-2

Bunu dene:

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

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

Bu cevap MySQL işlevlerini kullanır (ve tarihleri ​​dizelere çevirir, ki bu benim evcil hayvanımdan bir tanesidir).
Álvaro González

-3

--- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.