Làm thế nào để lấy ngày đầu tiên và ngày cuối cùng của năm hiện tại?


110

Sử dụng SQL Server 2000, làm cách nào để lấy ngày đầu tiên và ngày cuối cùng của năm hiện tại?

Đầu ra mong đợi:

01/01/201231/12/2012

Câu trả lời:


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

Truy vấn trên cung cấp giá trị ngày giờ cho nửa đêm đầu ngày 31 tháng 12. Khoảng thời gian này ngắn hơn khoảng 24 giờ so với thời điểm cuối cùng trong năm. Nếu bạn muốn bao gồm thời gian có thể xảy ra vào ngày 31 tháng 12, thì bạn nên so sánh với ngày đầu tiên của năm tiếp theo, với một <so sánh. Hoặc bạn có thể so sánh với vài mili giây cuối cùng của năm hiện tại, nhưng điều này vẫn để lại khoảng cách nếu bạn đang sử dụng thứ gì đó không phải DATETIME (chẳng hạn như 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

Chi tiết công nghệ

Điều này hoạt động bằng cách tìm ra số năm kể từ năm 1900 với DATEDIFF(yy, 0, GETDATE())và sau đó thêm nó vào một ngày không = ngày 1 tháng 1 năm 1900. Điều này có thể được thay đổi để hoạt động cho một ngày tùy ý bằng cách thay thế một GETDATE()phần hoặc một năm tùy ý bằng cách thay thế DATEDIFF(...)hàm bằng "Năm - 1900."

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

13

Đây là một cách khá đơn giản;

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

Nó không sexy, nhưng nó hoạt động.


1
Chỉ khả dụng bắt đầu từ Sql Server 2012.
Lukas

12

Bạn có thể lấy năm hiện tại bằng DATEPARThàm, từ ngày hiện tại lấy bằnggetUTCDate()

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

1
Điều này xuất ra chuỗi, không phải ngày tháng. Nếu đó là những gì bạn thực sự cần, đúng vậy, nhưng nếu bạn có thể sử dụng một trong hai, hãy giữ ngày dưới dạng ngày tháng và không sử dụng chúng dưới dạng chuỗi.
Jamie F

2
Tôi không đồng ý, OP đã không chỉ định và dữ liệu Formet đặt trong máy chủ sql có thể trở lại một cái gì đó như '2012/01/01 00:13:14' thay vì '01 / 01 / 2012'
RandyMorris

1
@RandyMorris, đồng ý, OP đã hỏi liệu anh ta có thể nhận được DATETIMEthay vì chuỗi hay không và rõ ràng điều đó có thể không khớp với đầu ra mong đợi theo câu hỏi.
Vikdor

1
Tại sao bạn lại sử dụng định dạng ngày không rõ ràng (và các chuỗi trong câu trả lời của bạn không khớp với định dạng trong nhận xét của bạn)? yyyyMMddlà rõ ràng.
Damien_The_Un Believer

1
@Damien_The_Un Believer, truy vấn trong câu trả lời là để khớp với kết quả mong đợi theo câu hỏi. Nhận xét về DATETIME là phản hồi cho nhận xét của OP về việc lấy ngày thay vì chuỗi. Câu trả lời không phản ánh cuộc thảo luận này.
Vikdor

7

chỉ cần viết: -

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

ngày bắt đầu của năm.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  

4

Mỗi năm đều có ngày đầu tiên là ngày đầu tiên và ngày thứ 31 là ngày cuối cùng, việc bạn phải làm là chỉ gắn năm với ngày và tháng đó, ví dụ: -

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]

1
Điều này không nhất thiết đúng, vì có rất nhiều lập trình viên tin tưởng vào thời gian .
krillgar 23/07/18

Bất cứ ai có thể cho một ví dụ về khi điều này sẽ không hoạt động?
slayernoah

@slayernoah Tùy thuộc vào cài đặt bản địa hóa của máy chủ, tôi nghĩ rằng điều này đôi khi sẽ tạo ra lỗi.
Jamie F

3

Để có được ngày đầu tiên và ngày cuối cùng của năm, người ta có thể sử dụng CONCAThàm. Giá trị kết quả có thể được chuyển thành bất kỳ kiểu nào.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear

Năm không hoạt động với tôi nhưng date_part hoạt động start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
thảm chùi chân

1

Đối với ngày bắt đầu của năm hiện tại:

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

Đối với ngày cuối cùng của năm hiện tại:

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

1

Một cách khác: (Kể từ SQL Server 2012)

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

0

Kiểm tra cái này:

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)

Bạn nên giải thích mã của bạn. Các bãi chứa mã thường bị phản đối và có thể bị xóa.
Lỗi

0

Có vẻ như bạn rất thú vị khi thực hiện một thao tác mọi thứ trong một năm nhất định, nếu thực sự là như vậy, tôi khuyên bạn nên sử dụng hàm YEAR () như sau:

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

Tương tự với DAY ()MONTH () . Chúng cũng có sẵn cho các biến thể MySQL / MariaDB và đã được giới thiệu trong SQL Server 2008 (vì vậy không phải cho năm 2000 cụ thể).


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

Đây là cho PL-SQL, bài đăng nói SQL Server 2000, vì vậy bạn phải sử dụng T-SQL. TO_DATE và sysdate không tồn tại trong T-SQL
Andrew Failor

-1

Trong Microsoft SQL Server (T-SQL), điều này có thể được thực hiện như sau

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

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

CURRENT_TIMESTAMP - trả về ngày máy chủ sql tại thời điểm thực hiện truy vấn.

NĂM - lấy phần năm của dấu thời gian hiện tại.

STR , LTRIM - hai hàm này được áp dụng để chúng ta có thể chuyển nó thành một varchar có thể được ghép với tiền tố mong muốn của chúng ta (trong trường hợp này là ngày đầu tiên của năm hoặc ngày cuối cùng của năm). Vì bất kỳ lý do gì, kết quả được tạo bởi hàm YEAR có khoảng trắng tiền tố. Để khắc phục chúng, chúng tôi sử dụng chức năng LTRIM được cắt bên trái.


-1

Nếu nó đến ngày 1 tháng 1, bạn có thể nó vẫn là ngày của năm trước.

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

Thử cái này:

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

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

Câu trả lời này sử dụng các hàm MySQL (và chuyển ngày thành chuỗi, đây là một trong những tên trộm thú cưng của tôi).
Álvaro González

-3

--- Bản trình diễn Lalmuni ---

create table Users
(
userid int,date_of_birth date
)

--- chèn giá trị ---

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.