- ベストアンサー
ODBC SQLサーバーでSQLを使いたい
- ODBC SQLサーバーでSQLを使いたい場合、実行日からさかのぼり、金曜日の日付を表示するSQLを作成しています。しかし、なぜか「金曜」がおかしいとエラーが出てしまいます。
- ODBC SQLサーバーを使用してSQLを実行する際、実行日からさかのぼり、金曜日の日付を表示するSQLを作成しています。しかし、なぜか「金曜」が正しく認識されず、エラーが発生してしまいます。
- ODBC SQLサーバーでSQLを実行する場合、実行日からさかのぼり、金曜日の日付を表示するためのSQLを作成しています。しかし、なぜか「金曜」が正しく処理されず、エラーが表示されてしまいます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
DATANAMEではなく、DATENAMEですよね。 ・書かれているコードは変数がバラバラです(@I、@CUNT、@COUNT) ・ループ内のIF文はDATEADD(DD,-1,GETDATE())と固定で切られているので、無限ループになる可能性大です。 ・DATENAMEで返ってくる文字列は「SET DATEFORMAT」に依存します。 「金曜」ではなく「金曜日」となることもあり得ますので、この方法でのチェックは汎用的ではありません。 そもそもループ処理で算出するというアプローチが非効率です。 DATENAMEではなく、DATEPARTを使う方法を紹介しておきます。 (なお、GETDATE()を直接使うと、デバッグが大変ですよ) DECLARE @EDATE datetime DECLARE @NOW datetime SET @NOW=GETDATE() SET @EDATE=CONVERT(varchar, CASE WHEN DATEPART(dw,@NOW)>=6 THEN DATEADD(d,6-DATEPART(dw,@NOW),@NOW) ELSE DATEADD(d,-1-DATEPART(dw,@NOW),@NOW) END,112)
その他の回答 (1)
- 山本 俊男(@yamamoto007)
- ベストアンサー率44% (4/9)
"金曜" ⇒ '金曜' ---------------------------------------------------------------- SET NOCOUNT ON DECLARE @EDATE DATETIME DECLARE @COUNT INT DECLARE @I INT SET @COUNT = 0 WHILE ( @I <> -7 ) BEGIN IF ( DATENAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = '金曜' BREAK ELSE SELECT @COUNT = @COUNT + 1 END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112)) SELECT @EDATE
お礼
何度も申し訳ないです>< 色々いじくって実行したら無限ループになり内容を目で見ながらソースをこっちに書いてました。 変数も見てわかってもらえる為に本物と変えて書いてたんですが、変更していない所もあって 削除しようと色々探してたところでした申し訳ないです。 WHILE ( @COUNT <> -7 )と書くつもりでした。 教えられたとおりに試してきますね。 ありがとうございました。
補足
動く事は動くようになったのですが、本日の日付が結果に出てきてしまいます。 SELECT @COUNT = @COUNT + 1 ここも間違えていました。 SELECT @COUNT = @COUNT - 1 こうなります。 過去直近の金曜日を取得するまで、ループを回って@COUNTをカウントアップ?(ダウン)していきます。 金曜日を見つけたらそのループを出て、本日の日付から金曜日になるまでカウントを取り続けた@COUNTで減算をすれば出るかなと思って作っています。 SET NOCOUNT ON DECLARE @EDATE DATETIME '直近の金曜日を入れる変数 DECLARE @COUNT INT '直近の金曜日までのカウント SET @COUNT = 0 '初期値は0 WHILE ( @COUNT <> -7 ) '一週間ループさせたいです BEGIN IF ( DATENAME( WEEKDAY, DATEADD( DD, -1, GETDATE()))) = '金曜' '本日の日付をマイナスして、金曜になればループを抜けたい※ここの-1も変数にしてカウントを1個ずつ上げていかないといけない? BREAK '処理終了 ELSE SELECT @COUNT = @COUNT - 1 '金曜日を表示させる為に金曜が見つかるまでのカウントアップ END SET @EDATE = CONVERT( CHAR, CONVERT( VARCHAR, DATEADD(DD, @COUNT, GETDATE()), 112)) '本日日付から@COUNT分マイナスして直近の金曜日を求めたい SELECT @EDATE ぐだぐだ書いてしまって申し訳ありませんがやりたい事はこうなります。
お礼
かなりぐだぐだな書き方をしていましたね>< 最終これを見る前に自分で手直しをして表示させる事は出来ました。 GETDATE()は実行日をパラメータで変更したらデバック出来るのでは無いかと考えています。 しかし完成してからこの書き込みを見たのですが自分のソースが恥ずかしくなりますねw 先輩にダサいSQLと笑われちゃいました。 頑張って効率の良い書き方を勉強していきたいと思います。 また明日にでも月初第一金曜日を求めるSQLを考えないといけないので、ここで質問をさせて頂きます。 見かけた際にはアドバイスをよろしくお願い致します。