Minimum tarihi döndürmek için SQL Server işlevi (1 Ocak 1753)


94

Datetime için minimum değeri, yani 1 Ocak 1753'ü döndürecek bir SQL Server işlevi arıyorum. Bu tarih değerini betiğime kodlamamayı tercih ederim.

Böyle bir şey var mı? (Karşılaştırma için, C # dilinde, sadece yapabilirim DateTime.MinValue) Yoksa bunu kendim mi yazmalıyım?

Microsoft SQL Server 2008 Express kullanıyorum.


2
Merak ediyorum: Bunun yerine sütunun NULL olmasına izin vermek yerine neden bu tarihi kullanmayı planlıyorsunuz?
Joe Stefanelli

1
Sen kullanabilirsiniz CONVERT(smalldatetime, 0)için smalldatetime.
Gabe

5
CONVERT (smalldatetime, 0) veya CONVERT (datetime, 0) veya cast (datetime olarak 0) minimum datetime değeri değil
Gennady Vanin Геннадий Saat 07:34

2
@Joe: Sütun NULL değerlere izin vermiyor ve bu tabloyu oluşturmadığım için değiştirmek istemiyorum.
Jeremy

Yanıtlar:


95

Aşağıdaki gibi minimum tarih değerini döndüren bir Kullanıcı Tanımlı İşlev yazabilirsiniz :

select cast(-53690 as datetime)

Sonra bu işlevi komut dosyalarınızda kullanın ve eğer onu değiştirmeniz gerekirse, bunu yapabileceğiniz tek bir yer vardır.

Alternatif olarak, daha iyi okunabilirlik için tercih ederseniz bu sorguyu kullanabilirsiniz:

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

Örnek İşlev

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

Kullanım

select dbo.DateTimeMinValue() as DateTimeMinValue

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

56
Eğer keyfi bir sabiti vardır gidiyoruz, '1753-1-1'çok daha iyi olduğunu-53690
Gabe

6
İşlev adı, değerin anlamını açık hale getirecektir.
RedFilter

3
SQL Server 2012'de bile getdate () 'e benzer minimum tarihi almak için bir işlev yoktur, bu nedenle yukarıdaki tek olası çözümdür. Bu, sql server 2012 ile ilgili çözümde daha iyi bir çözüm arayan herkes içindir.
Ram

1
Sadece DateTime2 (7) kullanın. NET DateTime türüyle tam olarak eşleşir. Sql 'datetime' kullanmak, 'nvarchar' yerine 'varchar' kullanmak kadar kötüdür. 'nvarchar', .NET String türüyle hizalanır. Aynı fikir. O zaman DateTime.MinValue'yu her yerde kullanabilirsiniz.
Triynko

2
Aşağıda Frank Gillich tarafından belirtildiği gibi, cast('17530101' as datetime)bölgesel sorunları da önleyecektir ve -53690'dan biraz daha okunabilir.
Jim

29

SqlDateTime nesnesini gördünüz mü ? SqlDateTime.MinValueminimum tarihinizi almak için kullanın (1 Ocak 1753).


33
Bunun bir .NET işlevi değil, bir SQL işlevi olması gerekir.
Jeremy

5
SqlDateTime.MinValue yararlı olsa da, bunu bir yanıt olarak almak aldatıcıdır. @Jeremy yerel bir sql işlevi istiyor, .NET'in sınıf kitaplığından bir şey değil
Evan

6
artı bir tane buna benzer bir soruya yardımcı oldu ama .Net bağlamında SQL değil; bu soruda olduğu gibi ..
t_plusplus

Belki bunu yeni U-SQL
Kapé

14

Yetersiz itibar puanları nedeniyle kabul edilen cevap hakkında yorum yapamadığım için yorumum cevap olarak geliyor.

select cast('1753-1-1' as datetime)YYYY-AA-GG biçimindeki bir tarih tanımlamasını kabul etmeyen bölgesel ayarlara sahip bir veri tabanında çalıştırılırsa bunun kullanılması başarısız olur.

Bunun yerine select cast(-53690 as datetime)veya a Convertbelirtilen tarih saat biçimini kullanın.


6

'yyyymmdd'Bölgesel sorunları önlemek için tarihi yerel değer olarak girin :

select cast('17530101' as datetime)

Evet, TSQL olsaydı harika olurdu MinDate() = '00010101', ama böyle bir şans yok.


4

İşte minimum tarih değerini almanın hızlı ve kolay okunabilir bir yolu

Not: Bu bir Belirleyici Fonksiyondur , bu nedenle performansı daha da iyileştirmek için geri dönüş değerine SCHEMABINDING İLE başvurabiliriz.

Bir işlev oluşturun

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

END

İşlevi çağırın

dbo.MinDate()

örnek 1

PRINT dbo.MinDate()

Örnek 2

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

Örnek 3

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

Örnek 4

SELECT dbo.MinDate() AS MinDate

Örnek 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate

3

1 Ocak 1753 değil, ancak şunu ortaya koyan cast ('' datetime olarak) seçin: 1900-01-01 00: 00: 00.000, SQL sunucusu tarafından varsayılan değeri verir. (Zaten bana daha başlatılmamış görünüyor)


2
Bu doğru değil. Temel tarih saati 1 Ocak 1900 00: 00: 00.000'dir (bununla ne elde edersiniz SELECT CONVERT(DATETIME, 0)), ancak tarih saatinin SQL Server'da tutabileceği gerçek minimum değer aslında OP'nin yazdığı 1753'tür . İşte o zaman Amerika da Gregoryen takvimine geçti ve SQL Server eksik günlerle uğraşmak zorunda kalmadı, vb . Bir taşma hakkında hata SELECT CONVERT(DATETIME, -53690)veriyor 1753-01-01 00:00:00.000ve SELECT CONVERT(DATETIME, -53691)veriyor.
bugybunny

0

SQL Server'da minimum tarihi almak için kullandığım şey bu. Lütfen küreselleşme dostu olduğunu unutmayın:

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

Şunu kullanarak arayın:

SELECT [dbo].[DateTimeMinValue]()

-1

datetimeGeriye dönük uyumluluğu bozacağı için aralığı değişmeyecektir. Böylece onu zor kodlayabilirsiniz.


2
Bu doğru, ancak kullanmak istediğim her yerde CONVERT (tarihsaat, '1753-1-1') yerine GetMinDate () veya buna benzer bir şey çağırmak yine de güzel olurdu.
Jeremy

@Jeremy: Ne olduğunu biliyorum convertama GetMinDate()işlev tanımına dalmam gerek. Yani kodunuzu korumam gerekirse, convertdeğişkeni tercih ederdim .
Andomar

1
Neyin işe yaradığını biliyor olabilirsiniz convert, ancak bunun önemini mutlaka bilemezsiniz 1753-1-1.
jwg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.