SQLServer2005で文字列の時刻の合計を出す方法は?

このQ&Aのポイント
  • SQLServer2005で、DayフィールドとTimeフィールドがvarchar2のテーブルから各日ごとの合計時刻を計算して出力する方法を教えてください。
  • 実現可能であれば、DateAdd関数やMAX関数などを使用しても結構です。また、TimeフィールドをDatetime型に変更する方法も知りたいです。
  • どうやらプロシージャや読み込んでから別途計算する必要があるようですが、具体的なやり方を教えていただけますか?
回答を見る
  • ベストアンサー

SQLServer2005で文字列の時刻の合計を出す方法はありますか?

SQLServer2005で以下のテーブルがあります。 [Day] [Time]   1  1:30   1  2:00   2  4:45   3  2:30   3  1:45 Dayフィールド、Timeフィールドは共にvarchar2です。 (Timeには"1:30"の文字列が入っています) このテーブルを読み込むとき、各日ごとの合計を計算して出力するSQL文がわかりません。 ■■ 出力イメージ ■■ Day Time   1 3:30   2 4:45   3 4:15 DateAdd関数やMAX関数等を使って考えましたが実現できませんでした。 こういう処理をSQL文でおこなうことは可能でしょうか? もし実現可能な場合、方法やだいたいのやり方でも結構ですのでご教示いただけませんでしょうか? TimeフィールドがDatetime型から可能でしょうか? それとも、プロシージャや読み込んでから別途計算しなおさないと無理でしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>Dayフィールド、Timeフィールドは共にvarchar2です。 SQL Server 2005を使用しているのですよね? varchar2は、「Oracle独自のデータ型」と認識していますが? 時刻をvarcharで管理するメリットって、思い浮かばないのですが? SQL例を提示しておきますので、何をやっているかは自分なりに調べてみてください。 select [day], sum(datepart(hh,[time])) +floor(sum(datepart(mi,[time]))/60) as hh, sum(datepart(mi,[time]))%60 as mm from tbl1 group by [day]

to-ko-
質問者

お礼

ご回答ありがとうございます。 >varchar2は、「Oracle独自のデータ型」と認識していますが? ご指摘とおりです。私の記述勘違いです。varcharでした。 >時刻をvarcharで管理するメリットって、思い浮かばないのですが? ある会社のシステム増強で、ユーザー先が昔のシステム(デーダベース)をそのまま残したいと要望されたためです。 SQL文のご教示ありがとうございました。 一応中身は理解したつもりですが、明日会社で再度検証します。 ありがとうございました。

関連するQ&A

  • YYYYMMDDhhmmss形式の文字列を日付時刻に変換・計算する方法

    YYYYMMDDhhmmss形式の文字列を日付時刻に変換・計算する方法 お世話になっております。 今回の質問内容なのですが、 あるテーブルにYYYYMMDDhhmmss形式(varchar(14))の列がありまして、 この値の時刻計算を行いたいと思っております。 YYYY/MM/DD hh:mm:ss形式であれば、DATEADD関数で 計算が可能なのですが、やり方がわからず苦戦しております。 例えば1秒加算させたいと思い、以下のSQL文を実行してみたのですが、 SELECT DATEADD(second,1,(CONVERT(DATETIME,'20100312111111'))) 「文字列から日付/時刻に変換できませんでした。」というエラーが 発生してダメでした。 時刻部分だけ取り出して、それに時分秒を分ける「:」をつけて変換し 計算するという方法は極力避けたいと思っています。 何かいい方法がありましたら、ご教示のほどよろしくお願い致します。

  • SQLServerでtime型への変換

    SQLServer2008R2 Expressを始めて使っています。 Microsoft SQL Server Management Studioで接続してビューを作成。 SQLクエリでdatetimeのデータとtime型の引き算をして、時間の計算結果を返してもらおうとしています。 テーブル名 test_table col1 = datetime型 col2 = time型 SELECT (CAST(col1 AS time(7)) - col2) FROM test_table; 正しいか正しくないかはまだちょっとわからないのですが、上のようなSQLを実行したいのです。 しかし、 SELECT CAST('2011-01-01 01:00:00' AS time(7)) AS test; というテストを行う段階で「timeメソッドを呼び出せません」とエラーが返ってきます。 書いてるものが違うのか、何か設定そのものが違うのでしょうか。 以下を参考にしました。 http://msdn.microsoft.com/ja-jp/library/bb677243.aspx 凄い初歩的な問題の気がするのですが、何処を調べればいいのかだけでも結構ですので、何かアドバイスがいただきたいです。。 よろしくお願いいたします。

  • SQLのビューについて

    SQLServer:2005 OS:XP こんにちは。お世話になっています。 SQLServerでビューを作成し、テーブル「a」の構成データにプラスして、前月の1日を入力させようとしています。 ビューの列に↓を入力すると CAST(YEAR(DATEADD(m, - 1, GETDATE())) AS varchar) + CAST(MONTH(DATEADD(m, - 1, GETDATE())) AS varchar) + CAST('1' AS varchar) 「200811」と出力されるのですが、このデータを日付型にするにはどのような関数を追加したらいいのでしょうか? アドバイスをお願いいたします。

  • SQLServerで・・・

    SQLを発行してデータ取得したいと考えています。 テーブルの構成は 名前 varchar(512) アクセス日付 datetime(8) 住所 varchar(512) の3つの項目です。 ここで日にちごとにアクセスした人をカウントしたいと考えています。 アクセス日付には 2002-12-24 19:10:20:17.00 2002-12-25 15:11:01:21.00 2002-12-25 09:25:20:08.00 2002-12-26 21:10:20:17.00 というフォーマット(デフォルト?)で格納されています。 この場合、2002年12月25日にアクセスした人をカウントする SQLを書きたいのですが、どのようにすればいいのでしょうか? select 名前, アクセス日付, 住所 from テーブル where アクセス日付 = '???'; 実際にSQLを発行できる環境があればいいのですが、 宜しくお願いいたします。

  • ODBC SQLサーバーでSQLを実行したい・・・

    ODBC SQLサーバーでSQLを実行したい・・・ 昨日から入り浸っている初心者PGです。 昨日は、実行日から直近の金曜日の日付を抽出するというSQLを質問させて頂きました。 今回は前月の月初第一金曜日に当たる日付を出力するSQLについての質問となります。 下記のSQLは先輩が作成したSQLになります。 もっと簡単に書けないか悩んでいます。 補足として日付は8桁で出力をしたいです。(例:20100507) 宜しければご教授賜りたいです。(原文そのままコピーしてますw) /* いけてるsql */ SELECT case (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime)))) when '-1' then datename(year,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) + datename(month,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) + RIGHT('00'+CONVERT(varchar,datename(day,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + 6) ),2) else datename(year,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) + datename(month,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) + RIGHT('00'+CONVERT(varchar,datename(day,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime) + (6 - (datepart(Dw,cast(datename(year,dateadd(mm, -1, getdate())) + '-' + datename(month,dateadd(mm, -1, getdate())) + '-' + '01' as datetime))))) ),2) end

  • SQLServerのテーブルについて

    今、SQLSERVER上に5200万行ほどのレコードを保持しているテーブルがあるとします。 クエリアナライザで検索条件を指定して検索しても 1時間ほどかかります。 そこでインデックスというものを追加したいのですが、 データ数が多いのか、うまくいきません。 どなたか教えて下さい。 ● hizuke | datetime ● name | varchar count | int area | varchar ●の部分にインデックスを付加したいと考えています。

  • テーブルに空文字を入力させない方法

    MYSQLで下記のようなテーブルがあります。codeが主キーになっています。 +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | day | varchar(255) | YES | | NULL | | | time_mm | varchar(255) | YES | | NULL | | | time_ss | varchar(255) | YES | | NULL | | | id | varchar(255) | YES | | NULL | | | code | varchar(255) | NO | PRI | NULL | | | stock | varchar(255) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ selectでデータを引っ張ってくると下記のようになります。 +------+---------+---------+-------+------+-------+ | day | time_mm | time_ss | id | code | stock | +------+---------+---------+-------+------+-------+ | NULL | NULL | NULL | dd | | NULL | | 1111 | 2222 | 3333 | 4444 | 1234 | 6666 | | 11 | 22 | 33 | 44 | 4649 | 66 | | 111 | 222 | 333 | 444 | 5963 | 666 | | NULL | NULL | fdfd | fdfd | fd | NULL | +------+---------+---------+-------+------+-------+ codeの一番上が空文字列になっているので、テーブルにデータが入っていると思うのですが、空文字も入力不可にさせたいです。 どのようにすれば実現させることができるでしょうか?

  • SQLServerでの日付関連に関する事

    こんにちは、質問させてください。 今、以下の構成のテーブル(test_tbl)があるとします。 --------------------------- filed = type = size --------------------------- name = varchar = 512 hizuke = datetime = 8 address = varchar = 512 --------------------------- 今、ある期間に当てはまる人のデータを抽出するため 以下のSQL文を発行しています。 ------------------------------------ select, name, address, substring(convert(varchar, hizuke, 112), 1, 4) + '/' + substring(convert(varchar, hizuke, 112), 5, 2) + '/' + substring(convert(varchar, hizuke, 112), 7, 2) from test_tbl where substring(convert(varchar, hizuke, 112), 1, 4) + '/' + substring(convert(varchar, hizuke, 112), 5, 2) + '/' + substring(convert(varchar, hizuke, 112), 7, 2) between '1999/11/02' and '2003/02/16' ----------------------------------------------------- と記述しています。 このSQLだと関数などたくさん使用しており 時間がかかってしょうがありません。 ※特に日付関連の部分 なにかいいアドバイスがある方、宜しくお願い致します。

  • SQLserverでの列の削除について

    SQLserver2000にてSQL文の練習をしている、データベースの初心者です。 SQLserverでは、直接列の削除ができないと聞きました。 ---------------------------------------- ALTER TABLE テーブル名 DROP 列名 ---------------------------------------- ↑このようにはできませんでした。 そこで、いったん削除したい列以外の列がある別のテーブルをつくってからテーブル名を変更する方法として、 1,新しいテーブルを、元のテーブルからデータをコピーして作る。 2,元のテーブルを削除 3,新しいテーブルの名前を元の名前に変更。 という手段を使えばよいという情報を得ましたが、1の部分がどうしてもできません。 (テーブル削除、テーブル名の変更はできました) ---------------------------------------- CREATE TABLE 新しいテーブル名 AS SELECT 削除した列以外の列名 FROM 元のテーブル名 ---------------------------------------- このようにすると、 ---------------------------------------- サーバー : メッセージ 156、レベル 15、状態 1、行 2 キーワード 'AS' 付近に正しくない構文があります。 ---------------------------------------- といわれてしまいます。 EnterpriseManagerを使わずにやる方法が知りたいです。 正しいSQL文をどうかご教授ください。 どうぞよろしくお願いいたします。 ※ちなみにOSはWIN2000を使っています。

  • SQLServer2000:テーブルの先頭に列を追加したい

    いつもお世話になっております SQLServer2000を使用しております。 あるテーブルに a,b,c,dという4つの項目が存在している状態で aの前にzというフィールドを追加したいと考えております。 Enterprise Managerを使えば簡単に行うことが出来ますが、 これをクエリアナライザで行いたい場合に どのようにSQL文を記述すればよいのか、見つけることが出来ませんでした。 このようなことは可能なのでしょうか。 ご存知の方がいらっしゃいましたら、ご教示のほど、何卒よろしくお願いいたします。