Điều này tiếp tục thu thập các phiếu bầu bổ sung thường xuyên, thậm chí vài năm sau đó, và vì vậy tôi cần cập nhật nó cho các phiên bản hiện đại của Sql Server. Đối với Sql Server 2008 trở lên, thật đơn giản:
cast(getDate() As Date)
Lưu ý rằng ba đoạn cuối gần cuối vẫn áp dụng và bạn thường cần lùi lại một bước và tìm cách tránh bị ép ngay từ đầu.
Nhưng cũng có những cách khác để thực hiện điều này. Đây là những điều phổ biến nhất.
Cách đúng (mới kể từ Sql Server 2008):
cast(getdate() As Date)
Cách đúng (cũ):
dateadd(dd, datediff(dd,0, getDate()), 0)
Điều này hiện đã cũ hơn, nhưng vẫn đáng để biết vì nó cũng có thể dễ dàng thích ứng với các thời điểm khác, chẳng hạn như khoảnh khắc đầu tiên của tháng, phút, giờ hoặc năm.
Cách đúng này sử dụng các hàm được ghi lại là một phần của tiêu chuẩn ansi và được đảm bảo hoạt động, nhưng có thể chậm hơn một chút. Nó hoạt động bằng cách tìm xem có bao nhiêu ngày từ ngày 0 đến ngày hiện tại và thêm số ngày đó trở lại ngày 0. Nó sẽ hoạt động bất kể ngày giờ của bạn được lưu trữ như thế nào và bất kể ngôn ngữ của bạn là gì.
Cách nhanh chóng:
cast(floor(cast(getdate() as float)) as datetime)
Điều này hoạt động vì các cột ngày giờ được lưu trữ dưới dạng giá trị nhị phân 8 byte. Truyền chúng để thả nổi, xếp chúng để loại bỏ phân số và phần thời gian của các giá trị sẽ biến mất khi bạn truyền chúng trở lại datetime. Tất cả chỉ thay đổi một chút mà không có logic phức tạp và nó rất Nhanh.
Lưu ý rằng điều này dựa trên chi tiết triển khai Microsoft có thể tự do thay đổi bất kỳ lúc nào, ngay cả trong bản cập nhật dịch vụ tự động. Nó cũng không phải là rất di động. Trên thực tế, rất ít khả năng cách triển khai này sẽ sớm thay đổi, nhưng điều quan trọng vẫn là phải nhận thức được mối nguy hiểm nếu bạn chọn sử dụng nó. Và bây giờ chúng tôi có tùy chọn để truyền làm ngày tháng, điều này hiếm khi cần thiết.
Cách sai:
cast(convert(char(11), getdate(), 113) as datetime)
Cách sai hoạt động bằng cách chuyển đổi thành một chuỗi, cắt ngắn chuỗi và chuyển đổi trở lại ngày giờ. Nó sai , vì hai lý do:1) nó có thể không hoạt động trên tất cả các ngôn ngữ và 2) đó là cách chậm nhất có thể để thực hiện việc này ... và không chỉ một chút; nó giống như một thứ tự cường độ chậm hơn các tùy chọn khác.
Cập nhật Điều này đã nhận được một số phiếu bầu gần đây, và vì vậy tôi muốn nói thêm rằng kể từ khi tôi đăng bài này, tôi đã thấy một số bằng chứng khá chắc chắn rằng Sql Server sẽ tối ưu hóa sự khác biệt về hiệu suất giữa cách "đúng" và cách "nhanh", nghĩa là bây giờ bạn nên ưu tiên cái cũ hơn.
Trong cả hai trường hợp, bạn muốn viết các truy vấn của mình để tránh phải thực hiện việc này ngay từ đầu . Rất hiếm khi bạn thực hiện công việc này trên cơ sở dữ liệu.
Ở hầu hết các nơi, cơ sở dữ liệu đã là điểm nghẽn của bạn. Nói chung, đó là máy chủ đắt nhất để thêm phần cứng vào để cải thiện hiệu suất và là máy chủ khó nhất để thực hiện đúng những bổ sung đó (ví dụ:bạn phải cân bằng đĩa với bộ nhớ). Đây cũng là khó khăn nhất để mở rộng quy mô ra bên ngoài, cả về mặt kỹ thuật và từ quan điểm kinh doanh; Về mặt kỹ thuật, việc thêm một máy chủ web hoặc ứng dụng dễ dàng hơn nhiều so với một máy chủ cơ sở dữ liệu và ngay cả khi điều đó là sai, bạn không phải trả 20.000 đô la + cho mỗi giấy phép máy chủ cho IIS hoặc apache.
Điểm tôi đang cố gắng đưa ra là bất cứ khi nào có thể, bạn nên thực hiện công việc này ở cấp ứng dụng. duy nhất Thời gian bạn sẽ thấy mình cắt bớt ngày giờ trên Máy chủ Sql là khi bạn cần nhóm theo ngày và thậm chí sau đó, bạn có thể nên có thêm một cột được thiết lập dưới dạng cột được tính toán, được duy trì tại thời điểm chèn / cập nhật hoặc được duy trì trong ứng dụng Hợp lý. Loại bỏ công việc nhiều cpu, phá vỡ chỉ mục này khỏi cơ sở dữ liệu của bạn.