- ベストアンサー
Access関数: なぜ日付を指定するとき""で囲むのか?
Accessの関数でdatediff関数というのがありますが、それを使う時に Datediff("yyyy",,)などと入力しますが、なぜDatediff関数では年、月などの表示形式を""でくくるのでしょうか? ""は文字列を表すのではないのでしょうか? 日付は##で囲まれるのでDatediff(#yyyy#,)ならわかるのですが。 重箱の隅をつつくような質問で申し訳ないのですが、""で囲むことに納得がいきません。 なぜ""で囲むのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>Datediff("yyyy",,) の"yyyy"は関数に与える引数で日付を表すものではありません (この引数はテキスト型で与えるという仕様です) >#yyyy# も日付を表すものではありませんよ 日付を表すには #2008/08/25# のように中が日付文字列でなければだめです DateDiffでも日付を取る第2,3引数には下のように日付を与えます DateDiff("yyyy",#1900/1/1#,Date())
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
>Datediff関数の結果は「26」など数値で表示されますね? なのでなぜ文字列で指定するのかわからないです. (#1のお礼) 関数の戻り値のデータタイプと引数のデータタイプと同一に論じることはおかしい。。 質問の件も、関数のお約束なので、議論しても、実効性は無い。 関数の処理を作る開発者の決め次第、受けとりから次第と思う。 私の感じる例(それぞれ深い意味があって、知らないだけかも判らないが) エクセルでもSUMIFの第2引数は >60 でよいと思うが =SUMIF(D1:D5,"=>60",D3:D5) と書かせるような例があって、個人的にはなくてもよかろうと思う。 Rangeでもエクセル関数はほとんどセル範囲を D1:D3のように入力するが、VBAではRange("D1:D3") である。
お礼
たいへんよくわかりました。 ありがとうございました。
- mshr1962
- ベストアンサー率39% (7417/18945)
#2の方のが正解です。 Datediff関数の始めの引数は時間間隔を表すだけの文字列です。 日付を表す数値ではないので日付表示の##で囲むことはしません。 ちなみにEXCELで使えるDATEDIF関数(LOTUS1-2-3との互換関数)でも =DATEDIF(A1,B1,"y") のように時間間隔の引数は""で囲みます。 どうしても納得できないならテキスト形式の変数を使ってください。 詳細は下記を参照 http://www.accessclub.jp/supbeg/042.html
お礼
よくわかりました。 ありがとうございました。
- noah7150
- ベストアンサー率46% (116/251)
元々、Basicに日付に関する定数の書き方が無いから 例えば A = 2008/08/25 と記述した場合 VBAでは型の自動変換があるので 2008÷08÷25 の結果をAに代入する事になる また、#は数値を表す意味で使われてますから##で囲むは紛らわしい なので日付を定数で書く場合は文字列として記述するようになったと思われます。 AccessのSQLなど新しい物はその辺の考慮がされている為かも (こっちのケースがまだ少ない) 同じDBでも昔からあるものはやはり文字列で型変換して代入する方法をとっている物があります。 進化の過程にあるものに関し使えないから可笑しいと言ってあげるのはかわいそうです。 別に文字列でも問題にならないでしょうから。
お礼
よくわかりました。 ありがとうございました。
表示形式ですから、日付は##で囲まれる云々は見当違い。
お礼
ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>""で囲むことに納得がいきません。 文字列として指定しないといけないからです。 多言語も含めて、一般的には#で区切る方が変なのです。 検索やフィルタ・SQLでは、日付型フィールド専用の指定で特殊な指定方法になります。
お礼
回答ありがとうございます。 Datediff関数の結果は「26」など数値で表示されますね? なのでなぜ文字列で指定するのかわからないです。
お礼
引数をテキスト型で与えて結果を数値で返すという使用なのですね。 理解できました。 ありがとうございました。