ฟังก์ชัน SQL Server เพื่อส่งกลับวันที่ต่ำสุด (1 มกราคม 1753)


94

ฉันกำลังมองหาฟังก์ชัน SQL Server เพื่อส่งคืนค่าต่ำสุดสำหรับวันที่และเวลาคือ 1 มกราคม 1753 ฉันไม่ต้องการฮาร์ดโค้ดค่าวันที่นั้นลงในสคริปต์ของฉัน

มีอะไรแบบนั้นหรือไม่? (สำหรับการเปรียบเทียบใน C # ฉันทำได้DateTime.MinValue) หรือฉันต้องเขียนเอง?

ฉันใช้ Microsoft SQL Server 2008 Express


2
แค่อยากรู้: ทำไมคุณถึงวางแผนที่จะใช้วันที่นั้นแทนที่จะปล่อยให้คอลัมน์เป็น NULL แทน?
Joe Stefanelli

1
คุณสามารถใช้CONVERT(smalldatetime, 0)สำหรับsmalldatetime.
Gabe

5
CONVERT (smalldatetime, 0) หรือ CONVERT (datetime, 0) หรือ cast (0 as datetime) ไม่ใช่ค่าต่ำสุดของวันที่และเวลา
Gennady Vanin ГеннадийВанин

2
@ โจ: คอลัมน์นี้ไม่อนุญาตให้มีค่า NULL และฉันไม่ต้องการเปลี่ยนแปลงเนื่องจากฉันไม่ได้สร้างตารางนี้
Jeremy

คำตอบ:


95

คุณสามารถเขียนUser Defined Functionที่ส่งกลับค่า min date ดังนี้:

select cast(-53690 as datetime)

จากนั้นใช้ฟังก์ชันนั้นในสคริปต์ของคุณและหากคุณจำเป็นต้องเปลี่ยนแปลงมีเพียงที่เดียวที่จะทำเช่นนั้น

หรือคุณสามารถใช้คำค้นหานี้ได้หากต้องการเพื่อให้อ่านง่ายขึ้น:

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

ตัวอย่างฟังก์ชัน

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

การใช้งาน

select dbo.DateTimeMinValue() as DateTimeMinValue

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

56
ถ้าคุณจะมีค่าคงที่ตามอำเภอใจ'1753-1-1'จะดีกว่า-53690
Gabe

6
ชื่อฟังก์ชันจะทำให้เข้าใจความหมายของค่าได้อย่างชัดเจน
RedFilter

3
ไม่มีฟังก์ชั่นแม้แต่ใน SQL Server 2012 เพื่อรับวันที่ต่ำสุดที่คล้ายกับ getdate () ด้วยเหตุนี้ข้างต้นจึงเป็นทางออกเดียวที่เป็นไปได้ นี่คือสำหรับทุกคนที่กำลังมองหาโซลูชันที่ดีกว่าในโซลูชันที่เกี่ยวข้องกับ sql server 2012
ราม

1
เพียงใช้ DateTime2 (7) มันจับคู่กับชนิด. NET DateTime ทุกประการ การใช้ sql 'datetime' นั้นไม่ดีพอ ๆ กับการใช้ 'varchar' แทน 'nvarchar' 'nvarchar' สอดคล้องกับประเภท. NET String ความคิดเดียวกัน. จากนั้นคุณก็สามารถใช้ DateTime.MinValue ได้ทุกที่
Triynko

2
ตามที่ Frank Gillich กล่าวไว้ด้านล่างcast('17530101' as datetime)จะหลีกเลี่ยงปัญหาระดับภูมิภาคและอ่านได้ง่ายกว่า -53690 เล็กน้อย
จิม

29

คุณเคยเห็นวัตถุ SqlDateTimeหรือไม่? ใช้SqlDateTime.MinValueเพื่อรับวันที่ขั้นต่ำของคุณ (1 ม.ค. 1753)


33
สิ่งนี้จำเป็นต้องเป็นฟังก์ชัน SQL ไม่ใช่ฟังก์ชัน. NET
Jeremy

5
แม้ว่า SqlDateTime.MinValue จะมีประโยชน์ แต่ก็เป็นการหลอกลวงที่จะให้สิ่งนี้เป็นคำตอบ @Jeremy กำลังขอฟังก์ชัน sql แบบเนทีฟไม่ใช่บางอย่างจากไลบรารีคลาสของ. NET
Evan

6
บวกหนึ่งสำหรับสิ่งนี้ช่วยในคำถามที่คล้ายกัน แต่ในบริบท. Net ไม่ใช่ SQL อย่างที่เป็นอยู่กับคำถามนี้ ..
t_plusplus

บางทีคุณอาจทำได้จริงโดยใช้U-SQL ใหม่
Kapé

14

เนื่องจากฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับคำตอบที่ได้รับการยอมรับเนื่องจากคะแนนชื่อเสียงของ บริษัท ไม่เพียงพอความคิดเห็นของฉันจึงเป็นคำตอบ

การใช้select cast('1753-1-1' as datetime)is เนื่องจากล้มเหลวหากรันบนฐานข้อมูลที่มีการตั้งค่าภูมิภาคไม่ยอมรับ datestring ของรูปแบบ YYYY-MM-DD

แทนที่จะใช้select cast(-53690 as datetime)หรือConvertมีรูปแบบวันที่และเวลาที่ระบุไว้


6

ป้อนวันที่เป็นค่าดั้งเดิม'yyyymmdd'เพื่อหลีกเลี่ยงปัญหาระดับภูมิภาค:

select cast('17530101' as datetime)

ใช่มันจะดีมากถ้า TSQL มีMinDate() = '00010101'แต่โชคไม่ดี


4

นี่คือวิธีที่รวดเร็วและสามารถอ่านค่าต่ำสุดได้

หมายเหตุ: นี่เป็นฟังก์ชันที่กำหนดดังนั้นเพื่อปรับปรุงประสิทธิภาพให้ดียิ่งขึ้นเราอาจนำไปใช้กับการกำหนดตารางเวลากับค่าที่ส่งคืน

สร้างฟังก์ชัน

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

END

เรียกใช้ฟังก์ชัน

dbo.MinDate()

ตัวอย่าง 1

PRINT dbo.MinDate()

ตัวอย่าง 2

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

ตัวอย่างที่ 3

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

ตัวอย่างที่ 4

SELECT dbo.MinDate() AS MinDate

ตัวอย่างที่ 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate

3

ไม่ใช่วันที่ 1 มกราคม 1753 แต่เลือก cast ('' เป็นวันที่และเวลา) ซึ่งจะเปิดเผย: 1900-01-01 00: 00: 00.000 ให้ค่าเริ่มต้นโดยเซิร์ฟเวอร์ SQL (ดูเหมือนจะยังไม่ได้เริ่มต้นสำหรับฉันมากกว่า)


2
สิ่งนี้ไม่ถูกต้อง วันที่และเวลาพื้นฐานคือ 1 มกราคม 1900 00: 00: 00.000 (สิ่งที่คุณได้รับSELECT CONVERT(DATETIME, 0)) แต่ค่าต่ำสุดที่แท้จริงที่วันที่และเวลาสามารถเก็บไว้ใน SQL Server คือในปี 1753 สิ่งที่ OP เขียน นั่นคือเมื่ออเมริกายังเปลี่ยนไปปฏิทินเกรกอเรียนและ SQL Server ไม่ได้มีการจัดการกับวันที่หายไป ฯลฯSELECT CONVERT(DATETIME, -53690)ให้1753-01-01 00:00:00.000และSELECT CONVERT(DATETIME, -53691)ให้ข้อผิดพลาดเกี่ยวกับการล้น
bugybunny

0

นี่คือสิ่งที่ฉันใช้เพื่อรับวันที่ต่ำสุดใน SQL Server โปรดทราบว่าเป็นมิตรกับโลกาภิวัตน์:

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

โทรโดยใช้:

SELECT [dbo].[DateTimeMinValue]()

-1

ช่วงสำหรับdatetimeจะไม่เปลี่ยนแปลงเนื่องจากจะทำลายความเข้ากันได้ย้อนหลัง ดังนั้นคุณสามารถฮาร์ดโค้ดได้


2
นั่นเป็นเรื่องจริง แต่ก็ยังเป็นการดีที่จะเรียก GetMinDate () หรืออะไรทำนองนั้นแทน CONVERT (วันที่เวลา '1753-1-1') ทุกที่ที่ฉันต้องการใช้
เจเรมี

@ เจเรมี: ฉันรู้ว่าอะไรconvertทำ แต่เพื่อGetMinDate()ฉันต้องดำน้ำในนิยามฟังก์ชัน ดังนั้นถ้าฉันต้องรักษารหัสของคุณฉันต้องการconvertตัวแปรมากกว่า
Andomar

1
คุณอาจจะรู้ว่าสิ่งที่convertทำ 1753-1-1แต่คุณจะไม่จำเป็นต้องทราบความสำคัญของ
jwg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.