1

データベースの時間値をステートメントに変更しようとしています。たとえば、06:00:00 から 12:00:00 までは午前、12:00:00 から 17:00:00 までは午後などの時間間隔です。私はそのような方法を使用していました:

Update dbo.denouncement_term_day_time

Set time_den = 'Morning'

WHERE (DATEPART(HOUR, time_den) >= 6
  AND DATEPART(MINUTE, time_den) >= 00
  AND DATEPART(SECOND, time_den) >= 00) AND
  (DATEPART(HOUR, time_den) <= 11
  AND DATEPART(MINUTE, time_den) <= 59
  AND DATEPART(SECOND, time_den) <= 59)

しかし、現在は機能しておらず、「文字列から日付および/または時刻を変換するときに変換に失敗しました」というエラーが表示されます。時間は varchar ですが。私が言ったように、最初の 50 ~ 100 行であれば、同じデータに対して機能します。しかし、250,000 raw の場合、このエラーが発生します。

ありがとうございました、

4

3 に答える 3

1

私はこれをどこから始めるべきかほとんどわかりません...

  1. varchar() フィールドで DATEPART を複数回呼び出そうとしているのはなぜですか? これには、最初に datetime 型への暗黙的な変換が必要ですが、これにはコストがかかります。文字列を日時に変換し、そこから作業する方がはるかに優れています。

  2. データベースに「朝」などを保存しないでください。CASE を使用して、datetime 値に基づいてわかりやすい値をエクスポートします。これは、SELECT で直接行うか、VIEW で抽象化することができます。

  3. このフィールドで DATEPART() を呼び出すと、日付/時刻文字列の代わりに「朝」などの文字列を設定しているため、将来エラーが発生することが保証されます。

  4. DATEPART(MINUTE, x) >= 0 および DATEPART(SECOND, x) >=0 は常に true を返します。負の分や秒というものはありません。

  5. 同様に、11:59:59 の最後の比較は、DATEPART(HOUR, d) < 12 として単純化できます。分や秒を見る必要はありません。(これは、おそらく文字列形式では扱っていない小数秒も処理します。

中心的な問題は、varchar() フィールド内の何かが、暗黙的に変換できる日付/時刻ではないことです。

計算列を使用した私の解決策:

  -- Add a new column for the proper datetime values.
  ALTER TABLE denouncement_term_day_time ADD datetime_den datetime;
  -- Clean your data before running the next line.
  UPDATE denouncement_term_day_time SET datetime_den = CAST(time_den AS datetime);
  -- Once converted, don't store the string dates anymore, it's wasteful
  ALTER TABLE denouncement_term_day_time DROP COLUMN time_den;
  -- Add a computed column to return the friendly time.
  ALTER TABLE denouncement_term_day_time ADD friendly_time AS
        CASE
          WHEN DATEPART(HOUR, datetime_den) > 16 THEN 'Evening'
          WHEN DATEPART(HOUR, datetime_den) > 11 THEN 'Afternoon'
          ELSE 'Morning'
        END

ただし、これでもユーザーがデータと同じタイム ゾーンにいることを前提としているため、問題があります。理想的には、この種のことは、データ層の奥深くではなく、ユーザーの場所、言語などにアクセスできる UI 層で行う必要があります。

于 2013-08-30T06:59:00.860 に答える