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

Nhận một số ngày trong tuần nhất định trong vòng một tuần do DATETIME đưa ra

Với các giá trị datetime, bạn phải rất cẩn thận! Đặc biệt là chỉ số của một ngày là khó khăn. Bạn nên luôn nghĩ đến những khác biệt cụ thể về văn hóa:

--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};

--Tôi thử điều này với văn hóa Đức, điều này bắt đầu từ Thứ Hai

SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day

--Giống như vậy với văn hóa Anh, bắt đầu từ Chủ nhật

SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day

--Bạn có thể có được nền văn hóa này một cách độc lập bằng cách thêm các giá trị đó với Modulo 7

SET LANGUAGE GERMAN;
SELECT (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7; --in Germany the Friday was 5th day

SET LANGUAGE ENGLISH;
SELECT (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7; --in English culture this is the 6th day

Giờ đây, cả hai truy vấn đều trả về cùng một giá trị cho Thứ Sáu, 6 .

Ví dụ của bạn cho thấy Chủ nhật là ngày đầu tiên trong tuần, vì vậy Chủ nhật trong tuần của một ngày nhất định thực tế phải là ngày 17 tháng 7. Sản lượng dự kiến ​​của bạn (ngày 24 tháng 7) là ngày đầu tiên của tuần sau, phải không?

Hãy thử điều này:

DECLARE @DayOfWeek TINYINT = 1;
DECLARE @Date DATETIME = '2016-07-21 23:47:11.133';
SELECT CAST(@Date + @DayOfWeek - (@@DATEFIRST + DATEPART(WEEKDAY,@Date)) % 7 AS DATE)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa một ký tự khỏi trường varchar SQL Server 2008

  2. Thực thi một thủ tục được lưu trữ trong SQL và xử lý kết quả

  3. INNER JOIN Where Mệnh đề

  4. Số ký tự tối đa mà nvarchar (MAX) sẽ chứa là bao nhiêu?

  5. 5 Thói quen giám sát cơ sở dữ liệu của các DBA thành công