質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

1990閲覧

SQL文でsyntax error

chintao1224

総合スコア156

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/06/02 03:59

visual studio 2017、postgresql 9.6を使っています。

SQL文でsyntax errorが出てしまいます。

SQL

1SELECT COUNT(*) AS cnt FROM tbla WHERE CURRENT_TIMESTAMP BETWEEN CAST(TO_CHAR(checkdate,'yyyy/mm/dd') || ' '" + strStartTime + ":00:00' AS TIMESTAMP) AND CAST(TO_CHAR(checkdate,'yyyy/mm/dd') || ' '" + strStartTime + ":00:00' AS TIMESTAMP) + CAST( '1 days' AS INTERVAL) + CAST( '-1 seconds' AS INTERVAL);

checkdateには「2000/1/1」のようなデータが入っています。date型です。
strStartTimeは'09'や'08'のようなデータが入っています。

現在日時が、2021/06/21 09:00:00~2021/06/22 08:59:59のようなデータ間にあるという抽出をしたいです。

SQL文をどのように変更すればよいでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/02 04:01

エラー全文コピペしてください
m.ts10806

2021/06/02 04:02

あとテーブル定義をcreate文で、サンプルデータをinsert文で提示してください
m.ts10806

2021/06/02 04:04

プログラムの中に書いてるコードですか? それより変数展開された生のSQLのほうが良いのですけど。直接DBに対して実行確認できないものはプログラムからも使えませんし
guest

回答2

0

C#側で文字列連結を行って、SQLを作ろうとしていますか? C#側でエラーになっているのか、SQL側でエラーになっているのか、提示されている情報だけではわからないのですが、本件の仕様を満たす文法的に正しいSQLは以下の通りです (わかりやすさのため、strStartTimeは文字列補間を利用しています)。

SQL

1SELECT COUNT(*) AS cnt FROM tbla 2WHERE CURRENT_TIMESTAMP BETWEEN CAST(TO_CHAR(checkdate,'yyyy/mm/dd') || ' {strStartTime}:00:00' AS TIMESTAMP) 3 AND CAST(TO_CHAR(checkdate,'yyyy/mm/dd') || ' {strStartTime}:00:00' AS TIMESTAMP) + CAST( '1 days' AS INTERVAL) + CAST( '-1 seconds' AS INTERVAL)

余談ですが、以下のようなクエリでも同じことができます。こちらだとCASTがないので、より簡潔なクエリになっていると思います。

SQL

1SELECT COUNT(*) AS cnt FROM tbla 2WHERE CURRENT_TIMESTAMP BETWEEN checkdate + INTERVAL '{strStartTime} HOURS' 3 AND checkdate + INTERVAL '1 DAY {strStartTime} HOURS -1 seconds';

投稿2021/06/02 04:32

neko_the_shadow

総合スコア2349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

生成されたSQL文をみてわかりました。starttimeの前にカンマが入っていました。お騒がせしました。

投稿2021/06/02 04:21

chintao1224

総合スコア156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問