重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

varchar(8)の項目に1を加えると・・・
「09110013」+1=「9110014 」となってしまいます。

結果が「09110014」と頭に「0」が付いたままにする方法はありませんか?

A 回答 (2件)

まずは、SQL Serverがどのように処理をしているか理解することです。



・varcharとintの加算を行う場合、データ型の優先順位の高い方のデータ型に暗黙的に変換されます。
 http://msdn.microsoft.com/ja-jp/library/ms190309 …

 varcharよりもintの優先順位は高いので、varcharがintに変換されます。

 '09110013'+1 => 9110013+1 => 9110014

 算出結果はvarcharではなくintです。当然前ゼロは付きません。

・上記intの結果をvarchar(8)のフィールドに無理やりセットしていることになるので、ここでも暗黙変換が起こります。

 9110014 => '9110014'

上記を理解すれば、前ゼロはvarcharに変換後、改めて付けるしかないことも理解いただけるでしょう。

DECLARE @V varchar(8) = '09110013'
SET @V = RIGHT('00000000'+CONVERT(varchar,(@V+1)),8)
SELECT @V

※暗黙変換はエラーのもとです。極力明示的な変換を行うことをお勧めします。

この回答への補足

ありがとうございました、勉強になりました。

↓こんな事を考えています。

自動採番するキー(構成は「年下2桁+月2桁+追番4桁」)や
各マスターのコードは数字だけの構成でもvarchar型に統一
しようと考えています。

また、時刻や時間を varchar(4)で持つか、smallintで持つか悩んだ結果
smallintで持ち、同時に時刻や時間を分に置き直して持つように
考えました・・・(足したり引いたりが分の方が簡単なので)
始業8:30→510分、終業17:00→1020分、一日の勤務時間1020分-510分→8:30
一週間の勤務時間510分×5→2550分→42:30、てな感じで使います。
時間→分はfloor(時間/100)*60+時間%100
分→時間はfloor(分/60)*100+分%60

何か間違った考え方をしていないでしょうか?

数字だけで構成されるキーやコードはどんな型にするのがオーソドックスなんでしょうか?
また、時刻や時間も計算も含めどんな扱い方がオーソドックスなんでしょうか?
(jamshid6さんの)標準的な考え方があれば教えて下さい。

補足日時:2009/11/02 23:40
    • good
    • 0

#1です。


私の、ということであれば、varchar(4)にしてチェック制約を掛けますかね。
(日付も結局別フィールドに持たせるならばdatetimeにしてしまいますが)
でもsmallintでも構わないと思います。
チェック制約も活用してきちんと収録されるようし、時間計算にはスカラー関数をいくつか用意すればいい話です。
(分単位の情報を計算列で持たせるのでもいいと思います)
    • good
    • 0
この回答へのお礼

ありがとうございました、参考にします。

お礼日時:2009/11/12 16:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す