SQL Serverの日時フィールドのデフォルト値をタイムスタンプに追加する


265

私たちのウェブサイトから送信されたフォームを収集するテーブルを持っていますが、何らかの理由で、彼らがテーブルを作成したときに、タイムスタンプをテーブルに入れていませんでした。レコードが入力された正確な日時を入力してください。

私はそれがどこかにあることを知っていますが、デフォルト値を設定する方法を見つけることができないようです(Accessのように、getNow()またはを使用しますNow())が、どこに置くかわかりません。


タイムゾーンに注意してください:stackoverflow.com/a/31296917/57475
Tanner

回答:


332

既存のテーブルの既存の列を変更するには:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

2
@TheQ-ありがとう。「YourTable」を自分のテーブル名に変更するとわかりますが、理解できないのは制約です。制約とは何ですか?コードを変更してテーブルの名前と一致させますか?
stephmoreland

@steph- TheQの答えは、私がそうではないと信じている既存の列を変更していると仮定していますか?このデフォルトの制約で新しい列を追加するためのコードについては、私の回答を参照してください。
マーティン・スミス

1
列がデフォルト値を持つためには、「デフォルトの制約」が必要であり、このコマンドはそれを追加します。制約には任意の名前を付けることができます。ManagementStudioでは通常、DF_TableNameという名前を付けます。
TheQ

@TheQ-それは完璧です、私はそれを試します。あなたは正しかった、私はすでにフィールドを持っていますが、私は新しいものを作成するのではなく、修正をそれに適用したかったのです。あなたのすべての答えをありがとう!
stephmoreland

6
あなたの代わりに現地時間のUTCタイムスタンプをしたい場合は、使用することができるGETUTCDATE()代わりにGETDATE()
Cocowalla

147

これは、SSMS GUIを使用して行うこともできます。

  1. あなたのテーブルには、デザインビュー(オブジェクト内のテーブルの上で右クリックしexplorer->に入れてデザイン
  2. テーブルに列を追加します(または、列が既に存在する場合は、更新する列をクリックします)。
  3. [列のプロパティ]で、下図のよう(getdate())に[ デフォルト値]または[バインド]フィールドに入力します

デザインビューのテーブルの画像


良い質問。それが機能dateadd(minute, 10, GetDate())するかどうかを確認しようとします。
トニーL.

SQL Serverのデザインビューで試してみましたが、値はリスト内の項目の1つと一致する必要があります。だから私はバックエンド側にそれを作った
シャリーフ

92

SQL Serverのそのテーブルで、その列のデフォルト値をに指定しますCURRENT_TIMESTAMP。その列のデータ型は、datetimeまたはdatetime2です。

例えば

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);

1
これはエラーメッセージ「[Bとタイムスタンプ]の間で変換できません」で失敗します。CURRENT_TIMESTAMPはバイナリ値であり、日時ではないようです。
Sindri Traustason 2013年

TIMESTAMPは次のよ​​うな入力を提供します。yyyy-mm-dd 00:00:00 UTC; DBが非常に大きくなる可能性があります。私は彼が日付yyyy-mm-ddだけを意味していたと思います。phpmyadminの通常のビューで「As Defined as」をクリックすると、そのデフォルト値を設定できます
アミン

@ Amine、TIMESTAMPはバイナリ値であり、通常6〜8バイトを使用します。文字列表現は、データベースが整数を文字列として格納していないのと同じように、まさにその表現です。(あなたがVARCHAR列に時間を入れて、試してみるのが面倒でない限り)
SilverbackNet

1
コンピューターのローカルタイムゾーンで値をCURRENT_TIMESTAMP返すことに注意してくださいdatetime。それは避けるべきです。代わりにSYSUTCDATETIMEwhichを使用datetime2してUTC で返します。

28

一方でマーク答えはで正しいです。

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

列にデフォルトの日時値を追加するときは、常にタイムゾーンに注意する必要があります。

たとえば、このdatetime値は、メンバーがWebサイトに参加したときにそれをユーザーに表示してほしいことを示すように設計されてGETDATE()おり、サーバーに時間を与えるため、ユーザーがサーバーとは異なるロケールにいる場合に不一致が生じる可能性があります。

海外のユーザーとの取引を想定している場合は、次のようなGETUTCDATE()を使用する方がよい場合があります。

現在のデータベースシステムのタイムスタンプを日時値として返します。データベースのタイムゾーンオフセットは含まれません。この値は、現在のUTC時間(協定世界時)を表します。この値は、SQL Serverのインスタンスが実行されているコンピューターのオペレーティングシステムから取得されます。

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETUTCDATE() FOR YourColumn

値を取得するとき、フロントエンドアプリケーション/ウェブサイトは、この値をUTC時間からそれを要求するユーザーのロケール/文化に変換する必要があります。


19

列のNullを禁止し、列にデフォルトを設定します getdate()

/*Deal with any existing NULLs*/
UPDATE YourTable SET created_date=GETDATE() /*Or some sentinel value 
                                                '19000101' maybe?*/
WHERE created_date IS NULL


/*Disallow NULLs*/
ALTER TABLE YourTable ALTER COLUMN created_date DATE NOT NULL

/*Add default constraint*/
ALTER TABLE YourTable ADD CONSTRAINT
    DF_YourTable_created_date DEFAULT GETDATE() FOR created_date

それをどのように変更して、既存のフィールド「created_date」を変更しますか?
stephmoreland

@steph-編集を参照してください。私の以前の答えは、これが新しいコラムだと思っていました。デフォルトを機能させるにはNULLを許可しないようにする必要があるため、既存の行をどのように処理しますか?
マーティン・スミス、

8

新しいテーブルを作成するときの構文は次のとおりです。

CREATE TABLE MyTable
(
    MYTableID INT IDENTITY(1,1),

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

新しい列を追加するときに、ALTER TABLEステートメントでも同様に機能します。
キャプテンセンシブル2016

7

これは私にとってはうまくいきます...

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

4

これも機能します:

CREATE TABLE Example(
...
created datetime default GETDATE()
);

または:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

これでうまくいきました。Oracle DeveloperでSQL Developerを使用しています。

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

わかりやすくするために、上記の回答を要約します。

テーブルの名前がCustomer で、4列以下であるとします。

テーブルに新しい列を追加する必要があります。挿入があるたびに、その列はイベントが発生した時間の記録を保持します。

解決:

新しい列を追加します。たとえば、timepurchaseが新しい列であることを、データ型がdatetimeのテーブルに追加します。

次に、次の変更を実行します。

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase

1

登録システムのデータベーステーブルを作成するとします。

IF OBJECT_ID('dbo.registration_demo', 'U') IS NOT NULL 
  DROP TABLE dbo.registration_demo; 

CREATE TABLE dbo.registration_demo (
    id INT IDENTITY PRIMARY KEY,
    name NVARCHAR(8)
);

今、カップルが登録します。

INSERT INTO dbo.registration_demo (name) VALUES
    ('John'),('Jane'),('Jeff');

次に、彼らが登録したときのタイムスタンプが必要であることに気付きます。

このアプリが地理的にローカライズされた地域に限定されている場合、ローカルサーバーの時刻をで使用できますGETDATE()。それ以外の場合は、デフォルトの値について、世界中の視聴者に対するTannerの考慮事項に注意する必要GETUTCDATE()があります。

この回答のような1つのステートメントで、デフォルト値を含む列を追加します。

ALTER TABLE dbo.registration_demo
ADD time_registered DATETIME DEFAULT GETUTCDATE();

別の登録者を取得して、データがどのように見えるかを見てみましょう。

INSERT INTO dbo.registration_demo (name) VALUES
    ('Julia');

SELECT * FROM dbo.registration_demo;
id    name    time_registered
1     John    NULL
2     Jane    NULL
3     Jeff    NULL
4     Julia   2016-06-21 14:32:57.767

0

SQLPlusでは、テーブルの作成中は次のようになります。

SQL>テーブルテストの作成

 ( Test_ID number not null,
   Test_Date date default sysdate not null );

SQL> Test(id)値に挿入(1);

 Test_ID Test_Date
       1 08-MAR-19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.