Hàm SQL Server trả về ngày tối thiểu (ngày 1 tháng 1 năm 1753)


91

Tôi đang tìm một hàm SQL Server để trả về giá trị tối thiểu cho datetime, cụ thể là ngày 1 tháng 1 năm 1753. Tôi không muốn viết cứng giá trị ngày đó vào tập lệnh của mình.

Có thứ gì như vậy tồn tại không? (Để so sánh, trong C #, tôi chỉ có thể làm DateTime.MinValue) Hoặc tôi sẽ phải tự viết cái này?

Tôi đang sử dụng Microsoft SQL Server 2008 Express.


2
Chỉ tò mò: Tại sao bạn định sử dụng ngày đó thay vì để cột là NULL?
Joe Stefanelli

1
Bạn có thể sử dụng CONVERT(smalldatetime, 0)cho smalldatetime.
Gabe

5
CONVERT (smalldatetime, 0) hoặc CONVERT (datetime, 0) hoặc dàn diễn viên (0 như datetime) không phải là giá trị tối thiểu là datetime
Gennady Vanin Геннадий Ванин

2
@Joe: Cột không cho phép giá trị NULL và tôi không muốn thay đổi nó vì tôi không tạo bảng này.
Jeremy

Câu trả lời:


90

Bạn có thể viết một Hàm do người dùng xác định trả về giá trị ngày tối thiểu như sau:

select cast(-53690 as datetime)

Sau đó, sử dụng chức năng đó trong các tập lệnh của bạn và nếu bạn cần thay đổi nó, chỉ có một nơi để làm điều đó.

Ngoài ra, bạn có thể sử dụng truy vấn này nếu bạn thích nó để dễ đọc hơn:

select cast('1753-1-1' as datetime)

Chức năng ví dụ

create function dbo.DateTimeMinValue()
returns datetime as
begin
    return (select cast(-53690 as datetime))
end

Sử dụng

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000

55
Nếu bạn đang đi để có một hằng số tùy ý, '1753-1-1'là tốt hơn nhiều so-53690
Gabe

6
Tên hàm sẽ làm rõ ý nghĩa của giá trị.
RedFilter

3
Không có hàm nào ngay cả trong SQL Server 2012 để lấy ngày tối thiểu tương tự như getdate (), do đó hàm trên là giải pháp khả thi duy nhất. Điều này dành cho bất kỳ ai đang tìm kiếm giải pháp tốt hơn trong giải pháp liên quan đến sql server 2012.
Ram

1
Chỉ cần sử dụng DateTime2 (7). Nó ánh xạ chính xác đến kiểu .NET DateTime. Sử dụng sql 'datetime' không tốt bằng việc sử dụng 'varchar' thay vì 'nvarchar'. 'nvarchar' phù hợp với kiểu Chuỗi .NET. Ý tưởng tương tự. Sau đó, bạn chỉ có thể sử dụng DateTime.MinValue ở mọi nơi.
Triynko

2
Như được đề cập bởi Frank Gillich dưới đây, cast('17530101' as datetime)cũng sẽ tránh các vấn đề khu vực và dễ đọc hơn một chút so với -53690.
Jim

29

Bạn đã thấy đối tượng SqlDateTime chưa? sử dụng SqlDateTime.MinValueđể có được ngày tối thiểu của bạn (ngày 1 tháng 1 năm 1753).


32
Đây cần phải là một hàm SQL, không phải một hàm .NET.
Jeremy

5
Mặc dù SqlDateTime.MinValue rất hữu ích, nhưng thật là lừa dối nếu coi đây là câu trả lời. @Jeremy đang yêu cầu một hàm sql gốc, không phải một cái gì đó từ thư viện lớp của .NET
Evan

6
cộng một cho điều này đã giúp giải quyết một câu hỏi tương tự nhưng trong ngữ cảnh .Net không phải SQL; vì nó là trường hợp với câu hỏi này ..
t_plusplus

Có lẽ bạn thực sự có thể đạt được điều này bằng cách sử dụng mới U-SQL
Kapé

13

Vì tôi không thể bình luận về câu trả lời được chấp nhận do không đủ điểm danh tiếng nên nhận xét của tôi được coi là một câu trả lời.

việc sử dụng select cast('1753-1-1' as datetime)sẽ không thành công nếu chạy trên cơ sở dữ liệu có cài đặt vùng không chấp nhận chuỗi dữ liệu có định dạng YYYY-MM-DD.

Thay vào đó, hãy sử dụng select cast(-53690 as datetime)hoặc Convertvới định dạng ngày giờ được chỉ định.


6

Nhập ngày làm giá trị gốc 'yyyymmdd'để tránh các vấn đề khu vực:

select cast('17530101' as datetime)

Vâng, sẽ thật tuyệt nếu TSQL có MinDate() = '00010101', nhưng không có may mắn như vậy.


4

Đây là một cách nhanh chóng và dễ đọc để nhận giá trị ngày tối thiểu

Lưu ý: Đây là một Hàm xác định , do đó, để cải thiện hiệu suất hơn nữa, chúng tôi cũng có thể áp dụng WITH SCHEMABINDING cho giá trị trả về.

Tạo một chức năng

CREATE FUNCTION MinDate()
RETURNS DATETIME WITH SCHEMABINDING
AS
BEGIN
    RETURN CONVERT(DATETIME, -53690)

END

Gọi hàm

dbo.MinDate()

ví dụ 1

PRINT dbo.MinDate()

Ví dụ 2

PRINT 'The minimimum date allowed in an SQL database is ' + CONVERT(VARCHAR(MAX), dbo.MinDate())

Ví dụ 3

SELECT * FROM Table WHERE DateValue > dbo.MinDate()

Ví dụ 4

SELECT dbo.MinDate() AS MinDate

Ví dụ 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate

3

Nó không phải là ngày 1 tháng 1 năm 1753 mà là chọn cast ('' là datetime) sẽ tiết lộ: 1900-01-01 00: 00: 00.000 cho giá trị mặc định của máy chủ SQL. (Dù sao thì tôi cũng có vẻ không quen thuộc hơn)


1
Điều này LAF không đúng. Ngày giờ cơ sở là ngày 1 tháng 1 năm 1900 00: 00: 00.000 (những gì bạn nhận được với SELECT CONVERT(DATETIME, 0)) nhưng giá trị tối thiểu thực tế mà ngày giờ có thể giữ trong SQL Server thực sự là 1753 những gì OP đã viết. Đó là khi Mỹ cũng chuyển sang lịch Gregorian và SQL Server không phải đối phó với những ngày bị thiếu, v.v. SELECT CONVERT(DATETIME, -53690)đưa ra 1753-01-01 00:00:00.000SELECT CONVERT(DATETIME, -53691)đưa ra lỗi về sự cố tràn.
bugybunny

0

Đây là những gì tôi sử dụng để lấy ngày tối thiểu trong SQL Server. Xin lưu ý rằng nó thân thiện với toàn cầu hóa:

CREATE FUNCTION [dbo].[DateTimeMinValue]()
RETURNS datetime
AS
BEGIN
  RETURN (SELECT
    CAST('17530101' AS datetime))
END

Gọi bằng:

SELECT [dbo].[DateTimeMinValue]()

-1

Phạm vi cho datetimesẽ không thay đổi, vì điều đó sẽ phá vỡ khả năng tương thích ngược. Vì vậy, bạn có thể khó mã hóa nó.


2
Điều đó đúng, nhưng vẫn sẽ rất hay nếu tôi gọi GetMinDate () hoặc một cái gì đó tương tự thay vì CONVERT (datetime, '1753-1-1') ở bất cứ nơi nào tôi cần sử dụng.
Jeremy

@Jeremy: Tôi biết cái gì convertlàm được, nhưng GetMinDate()tôi phải đi sâu vào định nghĩa hàm. Vì vậy, nếu tôi phải duy trì mã của bạn, tôi muốn convertbiến thể hơn.
Andomar

1
Bạn có thể biết những gì convertcó, nhưng bạn không nhất thiết phải biết tầm quan trọng của 1753-1-1.
jwg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.