Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Isoweek trong SQL Server 2005

Có một liên kết ở đây cho những lần thử khác trước đó http://www.sqlteam. com / forum / topic.asp? TOPIC_ID =60510

Đây là mã CŨ cho hàm

CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
DECLARE @rv int

SELECT @rv = datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
FROM (SELECT dateadd(ww, datediff(day, 0, @date)/7, 3) day4) a

RETURN @rv
END

Sau khi kết hợp câu trả lời tuyệt vời của @AndriyM với câu trả lời của riêng tôi, chúng tôi rút ra được 1 dòng. Đây là mã MỚI.

CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN

RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
-- replaced code for yet another improvement.
--RETURN (datepart(DY, dateadd(ww, datediff(d, 0, @date) / 7, 3))+6) / 7

END

Giải thích cho mã cũ (sẽ không giải thích mã mới. Đó là các đoạn từ mã của tôi và mã của AndriyM):

Tìm ngày thứ 4 trong tuần của ngày đã chọn

dateadd(week, datediff(day, 0, @date)/7, 3) 

Tìm kiếm năm - năm của ngày trong tuần 4 của một tuần luôn trùng với năm của năm đó

datediff(yy, 0, day4)

Khi thêm 3 ngày vào ngày đầu tiên của năm, một ngày ngẫu nhiên của ngày đầu tiên của năm đó sẽ được tìm thấy

dateadd(yy, datediff(yy, 0, day4),3)

tìm tuần tương đối của isoweek đầu tiên của isoyear

datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7

Tìm ngày thứ hai trừ đi 4 ngày của giờ thứ nhất sẽ cho kết quả là ngày thứ năm trong tuần TRƯỚC ngày đầu tiên của giờ thứ nhất của năm thứ nhất

dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)

Việc biết ngày thứ năm đầu tiên của tuần trước ngày thứ nhất đầu tiên và ngày thứ năm đầu tiên của tuần đã chọn, giúp việc tính toán trong tuần trở nên khá dễ dàng, không quan trọng việc thiết lập ngày đầu tiên vì các ngày trong tuần của cả hai ngày đều là thứ năm.

datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính tổng số đang chạy trong SQL Server

  2. Xóa không gian trống ở cuối trong nội dung trường

  3. Nhập 'xml' vào Sql Server

  4. Tại sao cột TEXT chỉ trả về 4096 byte?

  5. 7 cách tìm hàng trùng lặp trong SQL Server khi bỏ qua bất kỳ khóa chính nào