0

私は現在、(予定のような) 時間枠を保存する Firebird データベースに取り組んでいます。データでは、タイムスロットは整数形式で格納されますが、スロット時間ではありません。

例: スロット時間: 午前 11 時 データベース値: 660

データベース値は、午前 0 時からの分数で表されます。したがって、午前 11 時は午前 0 時から 660 分です。または正午は 720

質問Firebird で、この 660 を 1100 (整数のまま) または 540 を 900 (基本的には午前 9 時) として表示するように変換するにはどうすればよいですか?

4

2 に答える 2

2

TIMEまず、分数ではなく列としてデータベースに保存します。TIME技術的なレベルでは、Firebirdは午前 0 時からの 100 マイクロ秒として保存されることに注意してください。ただし、本当に分数として保存したい場合は、次を使用できます。

数分からTIME使用までDATEADD:

DATEADD(x MINUTE TO TIME'00:00')

を使用した分単位の時間DATEDIFF:

DATEDIFF(MINUTE FROM TIME'00:00' TO y)

そう:

SELECT 
  DATEADD(660 MINUTE TO TIME'00:00'), 
  DATEDIFF(MINUTE FROM TIME'00:00' TO TIME'11:00') 
FROM RDB$DATABASE

戻ります:11:00:00.000, 660

于 2014-08-21T11:57:50.950 に答える
2

データベースに保存したのは、その日の開始からの分です。つまり、60 で割るだけで時間になります。SQL では、除算の両方の引数が整数の場合、10 進数ではなく整数が返されることに注意してください。次のようなものがうまくいくはずです(分数がtimeslotフィールドに保存されていると仮定します):

SELECT 
 cast(timeslot / 60 as varchar(2)) || 
   case
     when mod(timeslot, 60) < 10 then '0'|| mod(timeslot, 60)
     else mod(timeslot, 60)
   end
FROM t

これにより、 (11,5時間)1130ではなく、午前11時30分が得られるはずです。1150

DATEADD関数も参照してください。

于 2014-08-21T11:11:50.350 に答える