Câu trả lời:
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
Đâ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.
Bạn có thể lấy năm hiện tại bằng DATEPART
hà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()))
DATETIME
thay 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.
yyyyMMdd
là rõ ràng.
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))
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]
Để 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 CONCAT
hà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
Đố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))
Một cách khác: (Kể từ SQL Server 2012)
SELECT
DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
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
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
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 () và 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ể).
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31')
from dual
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.
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
Thử cái này:
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.
--- 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