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.
sql-server
datetime
function
Jeremy
sumber
sumber
CONVERT(smalldatetime, 0)
untuksmalldatetime
.Jawaban:
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
sumber
'1753-1-1'
jauh lebih baik daripada-53690
cast('17530101' as datetime)
juga akan menghindari masalah regional dan sedikit lebih mudah dibaca daripada -53690.Pernahkah Anda melihat objek SqlDateTime ? gunakan
SqlDateTime.MinValue
untuk mendapatkan tanggal minimum Anda (Jan 1 1753).sumber
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 aConvert
dengan format tanggal waktu yang ditentukan.sumber
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.sumber
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
Contoh 1
Contoh 2
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
sumber
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)
sumber
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)
Memberi1753-01-01 00:00:00.000
danSELECT CONVERT(DATETIME, -53691)
memberikan kesalahan tentang overflow.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]()
sumber
Kisaran untuk
datetime
tidak akan berubah, karena itu akan merusak kompatibilitas ke belakang. Jadi Anda bisa mengodekannya dengan susah payah.sumber
convert
dilakukannya, tetapi karenaGetMinDate()
saya harus menyelami definisi fungsi. Jadi jika saya harus mempertahankan kode Anda, saya lebih memilihconvert
variannya.convert
itu, tetapi Anda belum tentu tahu pentingnya1753-1-1
.