2016-12-23 12 views
2
CREATE table orders (
custNum INT NOT NULL CHECK(custNum >= 0 AND custNum <= 999999), 
prodNum INT FOREIGN KEY REFERENCES product(prodNum), 
date DATE NOT NULL DATE_FORMAT(date, '%d-%m-%Y') CHECK(date >= '01-01-1993'), 
qty INT CHECK(qty >= 0 AND qty <= 100000), 
PRIMARY KEY (custNum, prodNum, date) 
); 

あなたは私が何をしようとしている私のDATEをDD-MM-YYYYに、01-01-1993以降にフォーマットするにはどうすればよいですか?

date DATE NOT NULL DATE_FORMAT(date, '%d-%m-%Y') CHECK(date >= '01-01-1993'), 

から見ることができるように、私はレコードを入力するとき、それはDD-MM-YYYYとも後日01-01-1993よりもする形式をチェックすることを確認することです。しかし、私はすべての日付の書式はほとんど私が欲しくないSELECTステートメントで動作することがわかります。私は日付の列の私のレコードを私が指定したのと同じフォーマットにしたい。あなたはどうやってそれを正確にしていますか?

ありがとう、何か助けていただきありがとうございます。私はSQLと制約を学んでいます。私は初心者ですので、私は理解しやすくなるために、できるだけシンプルにしたいと考えています(私の一行のステートメントに対する解決策が望ましい)。

EDIT:こんにちは、私は実際にはmySQL/MariaDBでそれを行うことを計画していますが、実際にはMicrosoft SQL Management Studioを使用しています。それがMicrosoft SQL Management Studioで動作できるのであれば、私はそれを感謝します。

+0

sql server or mysql? – e4c5

+0

こんにちは、私は実際にはmySQLでそれを行うことを計画していますが、実際にはMicrosoft SQL Management Studioを使用しているので、それが動作しないCHECKバグ(?)があります。それがMicrosoft SQL Management Studioで動作できるのであれば、私はそれを感謝します。 – Ken

+0

あなたはクライアントとして管理スタジオを使用していますか? – e4c5

答えて

0

質問に2つの問題があります。最初の問題は表現です。日付が選択肢に表示される方法を変更します。これを解決するには、現在の設定を確認するには

dbcc useroptions 

を実行してください。この最初の問題の解決策は、

です。o OSの設定を変更します。

Øサーバーの設定を英国英語に変更します。

Ø今すぐ新しいユーザーを作成し、

Øは今、あなたはオプションを見ることになるDBCC useroptionsを使用するには、変更されています。

Source

第2の問題は、checkという制約です。 dateformatを正しく変更すると、現在のcheckの制約が機能する可能性がありますが、正しいdateformatが使用されていることを確認することをお勧めします。

CHECK (REGISTRATION_DATE > TO_DATE('01-01-1993', 'dd-mm-yyyy')) 

続きを読むhereのようなものが必要です。これを実現するために

、あなたはmodify the check constraintする必要があります。オブジェクトエクスプローラで

、チェック 制約を含むテーブルを右クリックし、[デザイン]を選択。

テーブルデザイナメニューで、チェック制約をクリックします。

[制約の確認]ダイアログボックスの[選択されたチェック制約]で、 を編集する制約を選択します。

Bad habits to kick : mis-handling date/range queries - Aaron Bertrandからアクション

+0

ありがとうございます。これを試して。 – Ken

+0

@Ken大歓迎です。この答えがあなたの問題を解決したら、それを受け入れることを検討するかもしれません。 –

0

抜粋完了します。YYYY-MM-DDとは対照的に

を、YYYYMMDDは壊れることはありません。少なくともDATETIME型とSMALLDATETIME型の日付文字列リテラルに他の形式を使用する場合は、ユーザーがセッション設定が異なる場合や、別のサーバー設定。

SQL Server 2008では、新しい種類のものは、ユーザーまたはコンピュータの設定から少しだけ隔離されています。それでも、私は一貫性と安全のためにYYYYMMDDを使用します。

私はあなたがYYYY-MM-DDを使用していない実現が、YYYYMMDDが壊れていないという事実は、まだ適用されます。以下は

YYYYMMDD

create table orders (
    custnum int not null 
    , prodnum int not null 
    , [date] date not null 
    , qty  int not null 
    , constraint [pk_orders] primary key clustered (custnum, prodnum, date) 
    , constraint [fk_orders_prodnum] foreign key (prodnum) 
     references product(prodnum) 
    , constraint [chk_orders_custum_gte_0_lte_999999] 
     check (custnum >= 0 and custnum <= 999999) 
    , constraint [chk_orders_date_gt_19930101] 
     check ([date]>'19930101') 
    , constraint [chk_orders_qty_gt_0_lt_1000000] 
     check (qty >= 0 and qty <= 100000) 
); 

さらに読書とあなたの元create table文の再フォーマットです:

関連する問題