2012-09-19 73 views
5

Tôi đã thử nhưng không thể có được giải pháp phù hợp. Tôi muốn một truy vấn SQL liệt kê tất cả các ngày cuối tuần của năm hiện tại.Làm thế nào để có được tất cả các ngày cuối tuần của năm hiện tại trong SQL?

tôi đã cố gắng truy vấn SQL này:

WITH hier(num, lvl) AS (
    SELECT 0, 1 
      UNION ALL 
    SELECT 100, 1 
      UNION ALL 
    SELECT num + 1, lvl + 1 
    FROM hier 
    WHERE lvl < 100 
) 
SELECT lvl [Week], 
convert(date,DATEADD(dw, -DATEPART(dw, DATEADD(wk,DATEDIFF(wk,0,'12/31/'+convert(nvarchar,YEAR(getdate()))), 0)+6), 
DATEADD(wk, DATEDIFF(wk,0,'12/31/'+convert(nvarchar,YEAR(getdate()))), 0)+6) - num * 7,101) [End Date] 
FROM hier a 
where num < 52 
ORDER BY [End Date] asc 

đầu ra của nó là như thế này:

Week End date 
52 2012-01-14 
51 2012-01-21 
50 2012-01-28 
49 2012-02-04 

Tôi muốn ngày để bắt đầu từ đầu - vì vậy, bên trên là mất tích một ngày cuối tuần, mà là 2012-07-01. Ngoài ra, tôi muốn số tuần hiển thị là 1, 2, 3... thay vì 52, 51....

+0

Thứ nhất, xác định những gì bạn * * ý nghĩa của ngày kết thúc tuần - các nền văn hóa khác nhau xác định những điều khác nhau. Giả sử bạn có nghĩa là một ngày cuối tuần là thứ Bảy và Chủ Nhật, bạn cần ngày nào? Thứ bảy, chủ nhật, cả hai? Nếu cả hai, là hai cột trong một hàng hoặc là các hàng riêng biệt? –

+0

Ngày kết thúc là Thứ Bảy –

Trả lời

5

Khám phá this bài đăng trên blog.

Câu hỏi của bạn được giải thích chi tiết.

DECLARE @Year AS INT, 
@FirstDateOfYear DATETIME, 
@LastDateOfYear DATETIME 
-- You can change @year to any year you desire 
SELECT @year = 2010 
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0) 
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0) 
-- Creating Query to Prepare Year Data 
;WITH cte AS (
SELECT 1 AS DayID, 
@FirstDateOfYear AS FromDate, 
DATENAME(dw, @FirstDateOfYear) AS Dayname 
UNION ALL 
SELECT cte.DayID + 1 AS DayID, 
DATEADD(d, 1 ,cte.FromDate), 
DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname 
FROM cte 
WHERE DATEADD(d,1,cte.FromDate) < @LastDateOfYear 
) 
SELECT FromDate AS Date, Dayname 
FROM CTE 
WHERE DayName LIKE 'Sunday' 
/* 
WHERE DayName IN ('Saturday,Sunday') -- For Weekend 
WHERE DayName NOT IN ('Saturday','Sunday') -- For Weekday 
WHERE DayName LIKE 'Monday' -- For Monday 
WHERE DayName LIKE 'Sunday' -- For Sunday 
*/ 
OPTION (MaxRecursion 370) 
+0

nhưng bạn có thể cho tôi biết làm cách nào để thêm một cột in tuần 1, tuần 2, v.v. –

+1

Giải pháp này dựa vào người dùng có cài đặt ngôn ngữ tiếng Anh (các nền văn hóa khác có tên ngày khác) –

+2

@ Kartik Patel WeekofYr = DATEPART (WEEK, FromDate) .Trong truy vấn của tôi thì cũng giống như –

0

Cố gắng tìm ra thứ bảy đầu tiên bằng cách làm này:

  1. Start trên 2012-01-01
  2. Nếu nó không phải là một thứ Bảy, thêm một ngày
  3. Chuyển đến 2

Sau đó, vào một bảng tạm thời, thêm ngày đó và ngày sau (Chủ nhật). Sau đó, vòng lặp như sau:

  1. Thêm 7 và 8 ngày để ngày thứ Bảy cuối cùng bạn tìm thấy (bạn sẽ có được thứ Bảy sau và chủ nhật)
  2. Kiểm tra xem họ vẫn còn trong năm 2012
  3. Nếu họ , lưu trữ chúng trong bảng tạm thời và goto 1

Có thể có nhiều cách thanh lịch hơn, nhưng đó là giải pháp bẩn nhanh chóng của tôi &. Vì bạn không đăng bất kỳ mã nào về những gì bạn đã thử, tôi sẽ để triển khai cho bạn.

0

bạn có thể thử này

DECLARE @FirstDateOfYear DATETIME 
SET @FirstDateOfYear = ’2010-01-01′ 
SELECT DISTINCT DATEADD(d, number, @FirstDateOfYear), 
CASE DATEPART(dw, DATEADD(d, number, @FirstDateOfYear)) 
WHEN 7 THEN ‘Saturday’ 
WHEN 1 THEN ‘Sunday’ 
ELSE ‘Work Day’ 
END 
FROM master..spt_values 
WHERE number BETWEEN 0 AND 364 
AND (DATEPART(dw, DATEADD(d, number, @FirstDateOfYear)) = 1 OR DATEPART(dw, DATEADD(d, number, @FirstDateOfYear)) = 7) 
ORDER BY DATEADD(d, number, @FirstDateOfYear) 
3

Liệu điều này giúp

DECLARE @startDate DATETIME, @endDate DATETIME 
SELECT @startDate = '2012-01-01', @endDate = '2012-12-31' 
;WITH Calender AS (
    SELECT @startDate AS dt 
    UNION ALL 
    SELECT dt + 1 FROM Calender 
    WHERE dt + 1 <= @endDate 
) 
SELECT 
dt 
,NameMonth = DATENAME(Month, dt) 
,NameDay = DATENAME (Weekday,dt) 
,WeekofYr = DATEPART(WEEK, dt) FROM Calender 
WHERE DATENAME (Weekday,dt) IN ('Sunday') 
Option(MaxRecursion 0) 

quả (một phần)

dt      NameMonth NameDay WeekofYr 
2012-01-01 00:00:00.000 January  Sunday 1 
2012-01-08 00:00:00.000 January  Sunday 2 
............................................... 
............................................... 
2012-12-30 00:00:00.000 December Sunday 53  
+0

Giải pháp này * cũng * dựa vào người dùng có cài đặt ngôn ngữ tiếng Anh (các nền văn hóa khác sẽ có tên ngày khác nhau) –

0

này cũng làm việc

declare @dat datetime, @add int 

set @dat = '20120101' 
set @add = datepart(w,@dat) 

set @add = 5 - @add -- friday 

set @dat = dateadd(d,@add,@dat) 

while @dat <= '20121231' 
begin 
    print @dat 
    set @dat = dateadd(d,7,@dat) 
end 
0
;with AllDaysOfYear (Day) as (
    select DATEADD(year,DATEDIFF(year,0,CURRENT_TIMESTAMP),0) --Jan 1st 
    union all 
    select DATEADD(day,1,Day) from AllDaysOfYear 
    where DATEPART(year,DATEADD(day,1,Day)) = DATEPART(year,CURRENT_TIMESTAMP) 
) 
select 
    ROW_NUMBER() OVER (ORDER BY Day) as WeekNo, 
    Day 
from 
    AllDaysOfYear 
where 
    DATEPART(weekday,Day) = DATEPART(weekday,'20120714') 
option (maxrecursion 0) 

Thứ nhất, tạo ra một tập hợp của tất cả các ngày trong năm nay (AllDaysInYear). Sau đó, chọn những người có weekday là thứ bảy. Giá trị tôi đã sử dụng ('20120714') không quan trọng lắm - nó chỉ phải là bất kỳ ngày nào thứ bảy, từ bất kỳ năm nào. Tôi chỉ sử dụng nó để tránh cần phải có cài đặt cụ thể DATEFIRST hoặc ngôn ngữ.

0

Truy vấn này cho biết cách để có được ngày đầu tiên của năm nay và ngày đầu tiên của năm tiếp theo trong phần đầu tiên. Ngày đầu tiên của năm tiếp theo được tính một lần để không tiếp tục nhận và so sánh các phần của năm.

;WITH cte(TheDate,NextYear) AS 
(
    SELECT CAST(CONVERT(CHAR(4),GETDATE(),112)+'0101' AS DATETIME), 
     CAST(YEAR(GETDATE())*10000+10101 AS CHAR(8)) 
    UNION ALL 
    SELECT DateAdd(d,1,TheDate),NextYear 
    FROM cte 
    WHERE DateAdd(d,1,TheDate)<NextYear 
) 
    SELECT Week = DatePart(wk,TheDate), 
     TheDate 
    FROM cte 
    WHERE DateName(dw,TheDate) in ('Saturday') 
ORDER BY TheDate 
OPTION (MAXRECURSION 366) 
0
with t as 
(
select 1 b 
union all 
select 1 b 
union all 
select 1 b 
union all 
select 1 b 
union all 
select 1 b 
union all 
select 1 b 
union all 
select 1 b 
union all 
select 1 b 
) 
select * from 
(
select 
current_timestamp 
-datepart(dy,current_timestamp) 
+row_number() over (order by t.b) d 
from t, t t1, t t2 
) tmp 
where datepart(yyyy,d)=datepart(yyyy,current_timestamp) 
     and 
     DATENAME(dw,d)='sunday' 
Các vấn đề liên quan