最小日付を返すSQL Server関数(1753年1月1日)


91

datetimeの最小値、つまり1753年1月1日を返すSQL Server関数を探しています。その日付の値をスクリプトにハードコーディングしたくないのです。

そのようなものはありますか?(比較のために、C#では、私は単にそれを行うことができますDateTime.MinValue) か、またはこれを自分で書く必要がありますか?

Microsoft SQL Server 2008 Expressを使用しています。


2
気になるところ:代わりに列をNULLにするのではなく、なぜその日付を使用するつもりですか?
Joe Stefanelli、2009

1
あなたは使用することができますCONVERT(smalldatetime, 0)のためにsmalldatetime
Gabe

5
CONVERT(smalldatetime、0)またはCONVERT(datetime、0)またはcast(0 as datetime)はdatetimeの最小値ではありません
Gennady VaninГеннадийВанинSep

2
@Joe:この列ではNULL値を使用できません。このテーブルを作成していないので、変更したくありません。
ジェレミー

回答:


90

次のような最小日付値を返すユーザー定義関数を書くことができます:

select cast(-53690 as datetime)

次に、その関数をスクリプトで使用します。関数を変更する必要がある場合、それを行う場所は1つだけです。

または、読みやすくするためにこのクエリを使用することもできます。

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

55
任意の定数を使用する場合'1753-1-1'は、より優れています-53690
Gabe

6
関数名は、値の意味を明確にします。
RedFilter

3
SQL Server 2012でもgetdate()のような最小日付を取得する関数はないため、上記の方法が唯一の可能な解決策です。これは、SQL Server 2012関連のソリューションでより良いソリューションを探している人を対象としています。
Ram

1
DateTime2(7)を使用してください。.NET DateTime型に正確にマップされます。sql 'datetime'を使用することは、 'nvarchar'の代わりに 'varchar'を使用する場合とは異なります。'nvarchar'は.NET文字列型に対応しています。同じ考え。その後、どこでもDateTime.MinValueを使用できます。
Triynko 2016

2
以下のフランクギリッヒが言及しているcast('17530101' as datetime)ように、地域の問題も回避され、-53690よりも読みやすくなります。
ジム

29

SqlDateTimeオブジェクトを見ましたか?SqlDateTime.MinValue最小日付(1753年1月1日)を取得するために使用します。


32
これは、.NET関数ではなく、SQL関数である必要があります。
ジェレミー

5
SqlDateTime.MinValueは便利ですが、これを回答として使用するのは不正です。@Jeremyは、.NETのクラスライブラリからではなく、ネイティブSQL関数を要求しています
Evan

6
さらに、このための1つは、同様の質問に役立ちましたが、.NETコンテキストではSQLではありませんでした。それは...この質問の場合のように
t_plusplus

たぶん、あなたは実際に新しい使用してこれを達成することができますU-SQLを
Kapé

13

評判ポイントが不十分なため、受け入れられた回答についてコメントすることができないので、私のコメントは返信として送信されます。

select cast('1753-1-1' as datetime)YYYY-MM-DD形式の日付文字列を受け入れない地域設定のデータベースで実行すると、これを使用すると失敗します。

代わりに、指定された日時形式のselect cast(-53690 as datetime)またはを使用してくださいConvert


6

'yyyymmdd'地域の問題を回避するために、日付をネイティブ値として入力します。

select cast('17530101' as datetime)

はい、もしTSQLが持っていれば素晴らしいのですがMinDate() = '00010101'、そのような運はありません。


4

これは、最小の日付値を取得するための高速で読みやすい方法です

注:これは確定関数であるため、パフォーマンスをさらに向上させるために、戻り値にWITH SCHEMABINDINGを適用することもできます。

関数を作成する

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

1753年1月1日ではありませんが、選択したキャスト( ''日時として)を選択すると、1900-01-01 00:00:00.000がSQLサーバーによってデフォルト値になります。(とにかく私には初期化されていないように見えます)


1
これは正しくありません。基本の日時は1900年1月1日00:00:00.000(で取得SELECT CONVERT(DATETIME, 0)できる値)ですが、SQLサーバーで日時が保持できる実際の最小値は、実際には1753年のOPによるものです。アメリカはまた、グレゴリオ暦への切り替えとSQL Serverが抜け等日間に対処する必要はありませんということSELECT CONVERT(DATETIME, -53690)なります1753-01-01 00:00:00.000SELECT CONVERT(DATETIME, -53691)、オーバーフローに関するエラーが発生します。
bugybunny 2018年

0

これは、SQL Serverで最小日付を取得するために使用するものです。グローバリゼーションに対応していることに注意してください。

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

次を使用して呼び出す:

SELECT [dbo].[DateTimeMinValue]()

-1

の範囲datetimeは変更されません。下位互換性が失われるためです。だから、あなたはそれをハードコーディングすることができます。


2
それは真実ですが、それを使用する必要がある場合はいつでも、CONVERT(datetime、 '1753-1-1')の代わりにGetMinDate()またはそのような何かを呼び出すのが良いでしょう。
ジェレミー

@ジェレミー:私は何をするか知ってconvertいますがGetMinDate()、関数の定義に飛び込む必要があるからです。したがって、コードを維持する必要がある場合は、convertバリアントを使用します。
-Andomar

1
あなたは何をするか知っているかもしれませんがconvert、の重要性を必ずしも知っているとは限りません1753-1-1
jwg 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.