Fungsi SQL Server untuk mengembalikan tanggal minimum (1 Januari 1753)

93

Saya mencari fungsi SQL Server untuk mengembalikan nilai minimum untuk datetime, yaitu 1 Januari 1753. Saya lebih suka tidak memasukkan nilai tanggal itu ke dalam skrip saya.

Apakah yang seperti itu ada? (Sebagai perbandingan, di C #, saya bisa melakukannya DateTime.MinValue) Atau haruskah saya menulis ini sendiri?

Saya menggunakan Microsoft SQL Server 2008 Express.

Jeremy
sumber
2
Hanya ingin tahu: Mengapa Anda berencana untuk menggunakan tanggal itu daripada membiarkan kolom menjadi NULL?
Joe Stefanelli
1
Anda bisa menggunakan CONVERT(smalldatetime, 0)untuk smalldatetime.
Gabe
5
CONVERT (smalldatetime, 0) atau CONVERT (datetime, 0) atau cast (0 as datetime) bukan nilai minimum datetime
Gennady Vanin Геннадий Ванин
2
@ Joe: Kolom tidak mengizinkan nilai NULL, dan saya tidak ingin mengubahnya karena saya tidak membuat tabel ini.
Jeremy

Jawaban:

94

Anda bisa menulis Fungsi Buatan Pengguna yang mengembalikan nilai tanggal minimum seperti ini:

select cast(-53690 as datetime)

Kemudian gunakan fungsi itu dalam skrip Anda, dan jika Anda perlu mengubahnya, hanya ada satu tempat untuk melakukannya.

Alternatifnya, Anda dapat menggunakan kueri ini jika Anda lebih suka untuk keterbacaan yang lebih baik:

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

Contoh Fungsi

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

Pemakaian

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000
RedFilter
sumber
56
Jika Anda ingin memiliki konstanta yang sewenang-wenang, '1753-1-1'jauh lebih baik daripada-53690
Gabe
6
Nama fungsi akan memperjelas arti nilainya.
RedFilter
3
Tidak ada fungsi bahkan di SQL Server 2012 untuk mendapatkan tanggal minimum yang mirip dengan getdate () maka solusi di atas adalah satu-satunya solusi yang mungkin. Ini untuk siapa saja yang mencari solusi yang lebih baik dalam solusi terkait sql server 2012.
Ram
1
Cukup gunakan DateTime2 (7). Ini memetakan ke jenis DateTime .NET persis. Menggunakan sql 'datetime' sama buruknya dengan menggunakan 'varchar' daripada 'nvarchar'. 'nvarchar' sejajar dengan jenis String .NET. Ide yang sama. Kemudian Anda bisa menggunakan DateTime.MinValue di mana saja.
Triynko
2
Seperti yang disebutkan oleh Frank Gillich di bawah ini, cast('17530101' as datetime)juga akan menghindari masalah regional dan sedikit lebih mudah dibaca daripada -53690.
Jim
29

Pernahkah Anda melihat objek SqlDateTime ? gunakan SqlDateTime.MinValueuntuk mendapatkan tanggal minimum Anda (Jan 1 1753).

Naeem Sarfraz
sumber
33
Ini harus berupa fungsi SQL, bukan fungsi .NET.
Jeremy
5
Meskipun SqlDateTime.MinValue berguna, memiliki ini sebagai jawaban menipu. @ Jeremy meminta fungsi sql asli, bukan sesuatu dari perpustakaan kelas .NET
Evan
6
ditambah satu untuk ini membantu dengan pertanyaan serupa tetapi dalam konteks. Net bukan SQL; seperti halnya dengan pertanyaan ini ..
t_plusplus
Mungkin Anda benar-benar dapat mencapai ini dengan menggunakan U-SQL baru
Kapé
14

Karena saya tidak dapat mengomentari jawaban yang diterima karena poin reputasi yang tidak benar, komentar saya datang sebagai balasan.

menggunakan select cast('1753-1-1' as datetime)ini karena gagal jika dijalankan pada database dengan pengaturan regional tidak menerima tanggal format YYYY-MM-DD.

Sebagai gantinya gunakan select cast(-53690 as datetime)atau a Convertdengan format tanggal waktu yang ditentukan.

Rune Andersen
sumber
6

Masukkan tanggal sebagai nilai asli 'yyyymmdd'untuk menghindari masalah regional:

select cast('17530101' as datetime)

Ya, akan lebih bagus jika TSQL punya MinDate() = '00010101', tapi tidak beruntung.

Frank Gillich
sumber
4

Berikut adalah cara cepat dan sangat mudah dibaca untuk mendapatkan nilai tanggal minimum

Catatan: Ini adalah Fungsi Deterministik , jadi untuk meningkatkan kinerja lebih lanjut kita mungkin juga menerapkan DENGAN SCHEMABINDING ke nilai yang dikembalikan.

Buat sebuah fungsi

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

END

Panggil fungsi tersebut

dbo.MinDate()

Contoh 1

PRINT dbo.MinDate()

Contoh 2

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

Contoh 3

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

Contoh 4

SELECT dbo.MinDate() AS MinDate

Contoh 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate
WonderWorker
sumber
3

Ini bukan 1 Januari 1753 tetapi pilih cast ('' as datetime) yang mengungkapkan: 1900-01-01 00: 00: 00.000 memberikan nilai default oleh SQL server. (Tampak lebih tidak dimulai bagi saya)

Tomas Hesse
sumber
2
Ini tidak benar. Basis datetime adalah 1 Jan 1900 00: 00: 00.000 (apa yang Anda dapatkan SELECT CONVERT(DATETIME, 0)) tetapi nilai minimum aktual yang dapat disimpan datetime di SQL Server sebenarnya pada 1753 apa yang ditulis OP. Saat itulah Amerika juga beralih ke kalender Gregorian dan SQL Server tidak harus berurusan dengan hari-hari yang hilang, dll. SELECT CONVERT(DATETIME, -53690)Memberi 1753-01-01 00:00:00.000dan SELECT CONVERT(DATETIME, -53691)memberikan kesalahan tentang overflow.
bugybunny
0

Inilah yang saya gunakan untuk mendapatkan tanggal minimum di SQL Server. Harap dicatat bahwa ini ramah globalisasi:

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

Panggilan menggunakan:

SELECT [dbo].[DateTimeMinValue]()
CarneyCode
sumber
-1

Kisaran untuk datetimetidak akan berubah, karena itu akan merusak kompatibilitas ke belakang. Jadi Anda bisa mengodekannya dengan susah payah.

Andomar
sumber
2
Itu benar, tetapi akan tetap menyenangkan untuk memanggil GetMinDate () atau sesuatu seperti itu daripada CONVERT (datetime, '1753-1-1') di mana pun saya perlu menggunakannya.
Jeremy
@ Jeremy: Saya tahu apa yang convertdilakukannya, tetapi karena GetMinDate()saya harus menyelami definisi fungsi. Jadi jika saya harus mempertahankan kode Anda, saya lebih memilih convertvariannya.
Andomar
1
Anda mungkin tahu apa convertitu, tetapi Anda belum tentu tahu pentingnya 1753-1-1.
jwg