2009-10-06 82 views
5

Tôi đang làm việc trên một thủ tục dọn dẹp trên SQL Server 2005 mà phải xóa tất cả các hàng trong một bảng cũ hơn 1 năm trước + thời gian trôi qua trong năm hiện tại.Làm cách nào để có được ngày của năm đầu tiên của năm với SQL?

Ex: Nếu tôi thực hiện các thủ tục hiện nay 2009/06/10 nó phải xóa hàng lớn tuổi hơn 2008/01/01 00:00 (có nghĩa là năm 2007 bao gồm và ngược).

Làm cách nào để có được ngày của năm đầu tiên của năm?

Tôi đã thử điều này:

select cast((DATEPART(year, getdate()) -1)AS DATETIME);

nhưng tôi nhận 1905-07-02 00:00:00.000 và không 2008-01-01 00:00 (như tôi sai dự kiến).

Ai đó có thể giúp tôi không?

Trả lời

4

này sẽ làm việc:

select cast('01 jan' + CAST((DATEPART(year, getdate())-1) as varchar) AS DATETIME); 

(Tôi biết nó không phải là "tốt nhất" giải pháp và có lẽ liên quan đến nhiều phôi hơn cần thiết, nhưng nó hoạt động, và làm thế nào điều này sẽ được sử dụng nó có vẻ là một prag matic solution!)

+0

Hmm .. Thú vị như thế nào câu trả lời khác cho câu hỏi này (tại thời điểm viết) có 8 upvotes, trong khi tôi chỉ có 1 lên và 1 xuống bỏ phiếu, nhưng tôi là giải pháp duy nhất đưa ra câu trả lời đúng. (Ví dụ: Đối với ngày hôm nay (6 tháng 10 năm 2009), kết quả là 2008-01-01 00:00:00, trong khi giải pháp của Raj trả về 2009-01-01 00:00:00) – CraigTP

+1

Tôi thích SELECT CONVERT (DATETIME, CAST (YEAR (GETDATE()) - 1 AS VARCHAR) + '0101', 112) hoặc SELECT CONVERT (DATETIME, CAST (YEAR (GETDATE()) - 1 AS VARCHAR), 112) nữa, vì nó chỉ định định dạng đầu vào. – LukLed

+0

@CraigTP: Tôi đã tự upvoted bản thân bạn vì bạn đã có câu trả lời đúng. Tôi đã thay đổi của tôi để phản ánh chỉnh sửa –

11

EDIT: Điều này đã trở lại năm hiện tại, khi câu hỏi là cho năm trước. Mã đã được sửa chữa để phản ánh điều này.

sử dụng này

select DATEADD(yy, DATEADD(yy, DATEDIFF(yy,0,getdate()), 0), -1) 

HOẶC sử dụng biến của bạn:

select DATEADD(yy, DATEADD(yy, DATEDIFF(yy,0,@YourDateTimeValue), 0), -1) 
+5

Đây là một điều khá chuẩn trong SQL Server mà mọi người nên tìm hiểu, đây là liên kết cho thấy cách thực hiện trong năm, tháng, ngày, giờ, phút ... http: //stackoverflow.com/questions/85373/floor-a-date-in-sql-server –

+0

Câu trả lời này tạo ra kết quả WRONG. – JamesM

0
SELECT DATEADD(year, DATEDIFF(year, 365, GETDATE()), 0) 
+1

SELECT DATEADD (năm, DATEDIFF (năm, 365, GETDATE()), 0) Không hoạt động với năm nhuận: ( –

Các vấn đề liên quan