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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Prisma

Prismaは、Node.js(TypeScript/JavaScript)向けのORM(Object-Relational Mapper) です。型安全なクエリ、マイグレーション、スキーマ管理を提供し、MySQL、PostgreSQL、SQLite、SQL Server などのデータベースをサポートしています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

390閲覧

prisma+postgresql でのDATE型の扱いについて

takabooo

総合スコア25

Prisma

Prismaは、Node.js(TypeScript/JavaScript)向けのORM(Object-Relational Mapper) です。型安全なクエリ、マイグレーション、スキーマ管理を提供し、MySQL、PostgreSQL、SQLite、SQL Server などのデータベースをサポートしています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2025/03/31 00:57

編集2025/03/31 01:35

実現したいこと

データベースにpostgresqlを使い、ORMにprismaを使っています。
データベースのtimezoneはUTCに設定しています。

prismaを使ったデータ保存、取得処理はバックエンド側のプログラムで行います。フロントエンドとバックエンドの連携はAPIを介して行います。フロントエンド側のtimezoneはjstです。
この状態で、DATE型の良い扱い方法がわかりません。

発生している問題・分からないこと

たとえば、registration_dateというDATE型のカラムをprismaのスキーマで定義します。

フロントエンドから渡ってくる値が、「2024-03-31」である場合、dbにそのままの形式で保存しようとするとエラーになるため、下記のように一旦、JSTをUTCに変換したDateオブジェクトを作成して値を保存しています。しかし、実際にDBに保存されたデータを見たところ「YYYY-MM-DD」形式で保存されおり、前日の日付が保存されていました。

一方、同カラムをprismaから取得すると2024-03-30T00:00:00.000Z といった形でYYYY-MM-DD形式ではなく、日付の後ろに自動で「T00:00:00.000Z」という日時データが付与されて取得されます。こちらもDBに保存された通り、前日の日付で取得されます。

フロントから送られてくる値はjstなので、prismaで保存する値もjstをutcに変換した日時で保存する必要があると思いますが、date型で定義すると日時はカットされて保存されているようです。この状態ですと、utcをjstに変換することができません。date型を使って、こうした齟齬が起きないようにするために何か良い方法はありますでしょうか。よく使われている手法などもあれば教えていただきたいです。よろしくお願いいたします。

該当のソースコード

// prismaの定義部分 registrationDate DateTime @map("registration_date") @db.Date
// 保存時 const registrationDate = new Date(input.registration_date + "T00:00:00+09:00");

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

わかりやすい方法が見つけられませんでした。

補足

特になし

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

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

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

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

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

YT0014

2025/03/31 02:46

直接UTCへの変換は試されましたか? 時刻が付加されておらず、JSTとして扱うのが適切とは思えないので。
takabooo

2025/03/31 05:06

「直接UTCへ」というのは、保存時に「T00:00:00+09:00」をつけずに以下のようにそのままiso形式にするようなイメージでしょうか。 const enteredDate = new Date(input.entered_date).toISOString(); 上記の場合ですと、 enteredDateは「2024-03-31T00:00:00.000Z」となり、データベースには「2024-03-31」で保存されました。
YT0014

2025/03/31 05:18

時刻及び時差共に付加しない、または、時刻のみを付加し時差0として変換する、というイメージで、ご指摘の通りです。 結果として、解決しているように見えるのですが、他に懸念されることがあるのでしょうか?
takabooo

2025/03/31 05:37

コメントありがとうございます。確かに、この方法であれば時刻に関係なく目的の日付で保存ができます。 お手数ですが、ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

入力値を、時刻及び時差共に付加しない、または、時刻のみを付加し時差なしで変換してください。

時刻が付加されておらず、JSTとして扱うのが適切とは思えないので。

投稿2025/03/31 07:40

YT0014

総合スコア1819

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

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

takabooo

2025/03/31 08:44

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問