Bagaimana cara mendapatkan tanggal pertama dan terakhir tahun ini?

110

Dengan menggunakan SQL Server 2000, bagaimana saya bisa mendapatkan tanggal pertama dan terakhir tahun ini?

Output yang Diharapkan:

01/01/2012 dan 31/12/2012

Gopal
sumber

Jawaban:

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

Kueri di atas memberikan nilai waktu tengah malam pada awal 31 Desember. Ini kurang dari 24 jam dari saat terakhir tahun ini. Jika Anda ingin memasukkan waktu yang mungkin terjadi pada 31 Desember, maka Anda harus membandingkan dengan tahun pertama tahun depan, dengan <perbandingan. Atau Anda dapat membandingkan dengan beberapa milidetik terakhir pada tahun ini, tetapi ini masih menyisakan celah jika Anda menggunakan sesuatu selain DATETIME (seperti 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

Detail Teknis

Ini bekerja dengan mencari tahu jumlah tahun sejak 1900 dengan DATEDIFF(yy, 0, GETDATE())dan kemudian menambahkannya ke tanggal nol = Jan 1, 1900. Ini dapat diubah untuk bekerja untuk tanggal sewenang-wenang dengan mengganti GETDATE()bagian atau tahun sewenang-wenang dengan mengganti DATEDIFF(...)fungsi dengan "Tahun - 1900."

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

Berikut cara yang cukup sederhana;

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

Itu tidak seksi, tapi berhasil.

Aubrey Love
sumber
1
Hanya tersedia mulai dari Sql Server 2012.
Lukas
12

Anda bisa mendapatkan tahun ini menggunakan DATEPARTfungsi, dari tanggal saat ini diperoleh dengan menggunakangetUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
Vikdor
sumber
1
Ini menghasilkan string, bukan tanggal. Jika itu yang benar-benar Anda butuhkan, ya, tetapi jika Anda dapat menggunakan salah satunya, pertahankan tanggal sebagai tanggal, dan jangan gunakan sebagai string.
Jamie F
2
Saya tidak setuju, OP tidak menentukan dan formet data yang ditetapkan di server sql mungkin mengembalikan sesuatu seperti '2012-01-01 12:13:14' bukannya '01 /
01/2012
1
@RandyMorris, setuju, OP bertanya apakah dia bisa mendapatkan DATETIMEalih-alih string dan jelas itu mungkin tidak cocok dengan output yang diharapkan sesuai pertanyaan.
Vikdor
1
Mengapa Anda menggunakan format tanggal yang ambigu (dan string dalam jawaban Anda tidak cocok dengan format dalam komentar Anda)? yyyyMMddtidak ambigu.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever, kueri dalam tanggapannya adalah untuk mencocokkan keluaran yang diharapkan sesuai pertanyaan. Komentar tentang DATETIME merupakan tanggapan atas komentar OP tentang mendapatkan tanggal, bukan string. Jawabannya tidak mencerminkan diskusi ini.
Vikdor
7

cukup tulis: -

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

tanggal mulai tahun ini.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  
Pradeep atkari
sumber
4

Setiap tahun ada tanggal 1 sebagai tanggal 1 dan tanggal 31 sebagai tanggal terakhir yang harus Anda lakukan hanya melampirkan tahun pada hari dan bulan itu misalnya: -

 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
sumber
1
Ini belum tentu benar, karena ada banyak kebohongan yang dipercaya oleh programmer tentang waktu .
krillgar
Adakah yang bisa memberi contoh kapan ini tidak akan berhasil?
slayernoah
@slayernoah Bergantung pada pengaturan lokalisasi server, menurut saya ini terkadang akan menghasilkan kesalahan.
Jamie F
3

Untuk mendapatkan hari pertama dan terakhir tahun ini, seseorang dapat menggunakan CONCATfungsinya. Nilai yang dihasilkan dapat diberikan ke semua jenis.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
Gayle
sumber
Tahun tidak berfungsi untuk saya tetapi date_part berfungsi start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat
1

Untuk tanggal mulai tahun ini:

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

Untuk tanggal akhir tahun ini:

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

Cara lain: (Sejak SQL Server 2012)

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

Lihat yang ini:

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
NeverHopeless
sumber
0
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
DHANA LAKSHMI
sumber
0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
zadeveloper
sumber
Anda harus menjelaskan kode Anda. Kode dump sering kali di-downvote dan mungkin dihapus.
Bug
0

Sepertinya Anda menarik dalam melakukan operasi semuanya untuk tahun tertentu, jika memang demikian, saya akan merekomendasikan untuk menggunakan fungsi YEAR () seperti ini:

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

Hal yang sama berlaku untuk DAY () dan MONTH () . Mereka juga tersedia untuk varian MySQL / MariaDB dan diperkenalkan di SQL Server 2008 (jadi tidak untuk 2000 tertentu).

chjortlund.dll
sumber
-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual
R-Dubz
sumber
Ini untuk PL-SQL, posting mengatakan SQL Server 2000, jadi Anda harus menggunakan T-SQL. To_Date dan Sysdate tidak ada di T-SQL
Andrew Failor
-1

Di Microsoft SQL Server (T-SQL) ini dapat dilakukan sebagai berikut

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

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

CURRENT_TIMESTAMP - mengembalikan tanggal sql server pada saat eksekusi kueri.

TAHUN - mendapatkan bagian tahun dari stempel waktu saat ini.

STR , LTRIM - kedua fungsi ini diterapkan sehingga kita dapat mengubahnya menjadi varchar yang dapat digabungkan dengan prefiks yang kita inginkan (dalam hal ini tanggal pertama atau tanggal terakhir tahun itu). Untuk alasan apa pun, hasil yang dihasilkan oleh fungsi YEAR memiliki spasi awalan. Untuk memperbaikinya kami menggunakan fungsi LTRIM yang merupakan trim kiri.

Soundararajan
sumber
-1

Jika mencapai tanggal 1 Jan Anda mungkin masih tanggal tahun terakhir.

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
sumber
-2

Coba ini:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')
Ivan
sumber
Microsoft SQL Server. Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi
Jawaban ini menggunakan fungsi MySQL (dan memasukkan tanggal ke string, yang merupakan salah satu hewan kesayangan saya).
Álvaro González
-3

--- Demo Lalmuni ---

create table Users
(
userid int,date_of_birth date
)

--- masukkan nilai ---

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
sumber