2015-10-12 23 views
6

Tôi muốn nhận được Thứ Ba trước đó (hoặc bất kỳ ngày nào trong tuần) cho ngày cụ thể. Đây là đầu vào mẫu và đầu ra dự kiến ​​cho Thứ Ba:Nhận ngày Thứ Ba trước đó (hoặc bất kỳ ngày nào trong tuần) cho ngày cụ thể

CREATE TABLE #temp(testdate DATETIME); 
INSERT INTO #temp(testdate) VALUES 
    ('2015-10-06 01:15'), -- Tue -> Tue 2015-10-06 00:00 
    ('2015-10-07 04:30'), -- Wed -> Tue 2015-10-06 00:00 
    ('2015-10-08 00:30'), -- Thu -> Tue 2015-10-06 00:00 
    ('2015-10-09 21:00'), -- Fri -> Tue 2015-10-06 00:00 
    ('2015-10-10 19:00'), -- Sat -> Tue 2015-10-06 00:00 
    ('2015-10-11 01:15'), -- Sun -> Tue 2015-10-06 00:00 
    ('2015-10-12 13:00'), -- Mon -> Tue 2015-10-06 00:00 

    ('2015-10-13 18:45'), -- Tue -> Tue 2015-10-13 00:00 
    ('2015-10-14 12:15'), -- Wed -> Tue 2015-10-13 00:00 
    ('2015-10-15 10:45'), -- Thu -> Tue 2015-10-13 00:00 
    ('2015-10-16 04:30'), -- Fri -> Tue 2015-10-13 00:00 
    ('2015-10-17 12:15'), -- Sat -> Tue 2015-10-13 00:00 
    ('2015-10-18 00:30'), -- Sun -> Tue 2015-10-13 00:00 
    ('2015-10-19 10:45'), -- Mon -> Tue 2015-10-13 00:00 

    ('2015-10-20 01:15'), -- Tue -> Tue 2015-10-20 00:00 
    ('2015-10-21 23:45'), -- Wed -> Tue 2015-10-20 00:00 
    ('2015-10-22 21:00'), -- Thu -> Tue 2015-10-20 00:00 
    ('2015-10-23 18:45'), -- Fri -> Tue 2015-10-20 00:00 
    ('2015-10-24 06:45'), -- Sat -> Tue 2015-10-20 00:00 
    ('2015-10-25 06:45'), -- Sun -> Tue 2015-10-20 00:00 
    ('2015-10-26 04:30'); -- Mon -> Tue 2015-10-20 00:00 

DECLARE @clampday AS INT = 3; -- Tuesday 
SELECT -- DATEADD/DATEPART/@clampday/??? 

Cách thích hợp nhất để lấy Thứ Ba trước (hoặc bất kỳ ngày nào trong tuần) bằng T-SQL?

+0

có thể trùng lặp của [Làm thế nào để bạn có được những "Tuần Ngày bắt đầu" và "Tuần ngày kết thúc" từ số tuần trong SQL Server?] (https://stackoverflow.com/questions/1267126/how-do-you-get-the-week-start-date-and-week-end-date-from-week-number-in-sql) –

Trả lời

5

tôi hy vọng điều này sẽ giúp bạn

SELECT DATEADD(day,- (DATEPART(dw, testdate) + @@DATEFIRST - 3) % 7,testdate) AS Saturday 
from #temp 

HOẶC

SELECT DATENAME(weekday,DATEADD(day,- (DATEPART(dw, testdate) + @@DATEFIRST - 3) % 7,testdate)) +' '+ 
     CONVERT(nvarchar,DATEADD(day,- (DATEPART(dw, testdate) + @@DATEFIRST - 3) % 7,testdate),101) AS Saturday 
from @temp 

OUTPUT sẽ ở bên dưới formate

Saturday 
Tuesday 10/06/2015 

Chú ý: toàn bộ truy vấn chỉ là sự kết hợp và tính toán của DATEFIRST, DATEPARTDATEADD để thao tác một thời gian

+0

@SalmanA 'DATEFIRST' chỉ định ngày đầu tiên của tuần. Mặc định tiếng Anh của Hoa Kỳ là 7, Chủ Nhật. 'DATEPART' Trả về một số nguyên đại diện cho ngày tháng được chỉ định của ngày được chỉ định. 'DATEADD' Trả về một ngày xác định với khoảng thời gian đã chỉ định (số nguyên đã ký) được thêm vào một ngày tháng cụ thể của ngày đó. Toàn bộ truy vấn chỉ là sự kết hợp và tính toán thời gian – wiretext

0

Bạn có thể sử dụng được số tuần bằng cách sử dụng DATEPART và sau đó sử dụng CASE tuyên bố trong sau:

SELECT 
    testdate, 
    CASE DATEPART(dw,testdate) WHEN 1 THEN DATEADD(dd,-5,testdate) 
           WHEN 2 THEN DATEADD(dd,-6,testdate) 
           WHEN 3 THEN DATEADD(dd, 0,testdate) 
           WHEN 4 THEN DATEADD(dd,-1,testdate) 
           WHEN 5 THEN DATEADD(dd,-2,testdate) 
           WHEN 6 THEN DATEADD(dd,-3,testdate) 
           WHEN 7 THEN DATEADD(dd,-4,testdate)          
    END 
FROM #temp 

Accoring để @jpw bình luận, bạn phải thiết lập DATEFIRST đến 7 (mặc định) trong sau:

SET DATEFIRST 7 
0
CREATE PROC FIND_TUESDAY_DATE 
(
@MYDATE DATE 
) 
AS 
BEGIN 
    SELECT CASE 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,0,@MYDATE) AS DATE)) = 'Tuesday' OR DATENAME(DW,CAST(DATEADD(DAY,-7,@MYDATE) AS DATE)) = 'Tuesday' 
      THEN CAST(DATEADD(DAY,-7,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-1,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-1,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-2,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-2,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-3,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-3,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-4,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-4,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-5,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-5,@MYDATE) AS DATE) 
      WHEN DATENAME(DW,CAST(DATEADD(DAY,-6,@MYDATE) AS DATE)) = 'Tuesday' THEN CAST(DATEADD(DAY,-6,@MYDATE) AS DATE) 
     END 
END 
GO 
0

Các cách hiệu quả nhất là sử dụng DATEADD và DATEDIFF:

Đây là tất cả các mã bạn cần, nó cũng làm việc cho các ngày trong tuần khác

DECLARE @daystoadd int = 1 -- tuesday 


SELECT DATEADD(week, datediff(d, @daystoadd, testdate)/7, @daystoadd) 
FROM #temp 
Các vấn đề liên quan