2009-07-09 28 views
10

tôi sử dụng DATEDIFF chức năng để lọc hồ sơ bổ sung trong tuần này chỉ:Có thể đặt bắt đầu tuần cho hàm T-SQL DATEDIFF không?

DATEDIFF(week, DateCreated, GETDATE()) = 0 

và tôi nhận thấy những gì nó giả định những gì trong tuần bắt đầu từ ngày chủ nhật. Nhưng trong trường hợp của tôi, tôi muốn thiết lập bắt đầu tuần vào thứ hai. Có thể nào đó bằng T-SQL?

Cảm ơn!


Cập nhật:

Dưới đây là một ví dụ cho thấy những gì DATEDIFF không kiểm tra @@DATEFIRST biến vì vậy tôi cần một giải pháp khác.

SET DATEFIRST 1; 

SELECT 
    DateCreated, 
    DATEDIFF(week, DateCreated, CAST('20090725' AS DATETIME)) AS D25, 
    DATEDIFF(week, DateCreated, CAST('20090726' AS DATETIME)) AS D26 
FROM 
(
    SELECT CAST('20090724' AS DATETIME) AS DateCreated 
    UNION 
    SELECT CAST('20090725' AS DATETIME) AS DateCreated 
) AS T 

Output:

DateCreated    D25   D26 
----------------------- ----------- ----------- 
2009-07-24 00:00:00.000 0   1 
2009-07-25 00:00:00.000 0   1 

(2 row(s) affected) 

26 Jul 2009 là Chủ nhật, và tôi muốn DATEDIFF trả về 0 trong cột thứ ba quá.

+0

Xin lỗi vì không kiểm tra xem DateFirst đã được kiểm tra bởi ngày hay chưa, ai có thể đoán được, tôi đã cập nhật câu trả lời của tôi để tính đến điều này. – Tetraneutron

Trả lời

19

Có nó có thể

SET DATEFIRST 1; -- Monday 

từ http://msdn.microsoft.com/en-us/library/ms181598.aspx

Có vẻ datediff không tôn trọng Datefirst, vì vậy làm cho nó làm như vậy chạy nó như thế này

create table #testDates (id int identity(1,1), dateAdded datetime) 
insert into #testDates values ('2009-07-09 15:41:39.510') -- thu 
insert into #testDates values ('2009-07-06 15:41:39.510') -- mon 
insert into #testDates values ('2009-07-05 15:41:39.510') -- sun 
insert into #testDates values ('2009-07-04 15:41:39.510') -- sat 

SET DATEFIRST 7 -- Sunday (Default 
select * from #testdates where datediff(ww, DATEADD(dd,[email protected]@datefirst,dateadded), DATEADD(dd,[email protected]@datefirst,getdate())) = 0 
SET DATEFIRST 1 -- Monday 
select * from #testdates where datediff(ww, DATEADD(dd,[email protected]@datefirst,dateadded), DATEADD(dd,[email protected]@datefirst,getdate())) = 0 

bị đánh cắp từ

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/8cc3493a-7ae5-4759-ab2a-e7683165320b

+1

Máy chủ SQL không xem xét giá trị biến ** DATEFIRST ** thực sự, từ tài liệu msdn: _Cài đặt xác định DATEFIRST không có hiệu lực trên DATEDIFF. DATEDIFF luôn sử dụng Chủ Nhật làm ngày đầu tiên trong tuần để đảm bảo chức năng là xác định._ Giải pháp thay thế tốt! :) – Rynkadink

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