• 締切済み
  • 困ってます

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 凄い初歩的な問題の気がするのですが、何処を調べればいいのかだけでも結構ですので、何かアドバイスがいただきたいです。。 よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数2278
  • ありがとう数0

みんなの回答

  • 回答No.2

お使いのバージョンは本当に「2008R2」でしょうか? 「2008R2」のExpress版はまだ出てなかった気もするのですが。 TIME型が追加されたのは2008からです。一度バージョンを確認してみてください。

共感・感謝の気持ちを伝えよう!

質問者からの補足

ありがとうございます。 接続先にカーソル乗せると[SQL Server 10.50.1617]と出てます。 スタートメニューからはSQL Server 2008 R2と表示されているので、そこからManagement Studioを利用していました。 サーバープロパティを開くとMicrosoft SQL Server Express Editionと書いてるので、多分2008R2 Expressというのを使っていると思うのですが、、、 以下を参考にインストールを実施しました。 http://blogs.msdn.com/b/osamum/archive/2011/01/07/sql-server-2008-r2-express.aspx

関連するQ&A

  • SQLServerでの書き方

    二つのテーブルをマージした後に、時間毎の平均値を取得したいのですが SQLServerではどのように書けばよろしいでしょうか? oracleだと↓こんな感じ select ti , avg(va) from ( select date as ti, value as va from test_table union all select date as ti, value as va from test1_table ) group by ti マージしたいテーブルを取得するSQL文をいじらずに実行できる方法を探しています。 以上、宜しくお願いします。

  • Float型の時の計算結果がおかしい

    ユーザー側で、Microsoft SQL Server2000を使用しています。 計算結果がおかしいので、仕事場で、SQL2008環境で互換モードでも、以下の現象が出てこまって おります。テストで、確認しました。 23.0 - 22.1 の計算結果を0.9と出したいのですが、  0.899999999999999 と結果が返ってきます。 どこが間違っているのでしょうか? SELECT [Field01] AS 'Field01' ,[Field02] AS 'Field02' ,[Field01]-[Field02] AS 'Field01-02' ,(CAST(23 AS FLOAT) - cast(22.1 AS FLOAT) ) AS 'test1' ,(CAST(23 AS REAL ) - cast(22.1 AS REAL ) ) AS 'test2' FROM [dbo].[Table01]

  • MS SQL Serverでのクエリ文

    MS SQL2005 の”SQL Server Management Studio”を使って下のクエリーを実行します。 例1は実行できますが、例2は実行できません。 なぜでしょうか? 例1 select * from [test].[dbo].[test_table] 例2 select * from ('[test].[dbo]' + '.[test_table]')

  • 回答No.1

単純に select col1 - col2 from test_table ではダメですか? col1からcol2前の日付時刻を返します。

共感・感謝の気持ちを伝えよう!

質問者からの補足

datetimeからtimeを計算できるんですね。これも知りませんでした。。 すいません、質問にちゃんと書いてなかったのですが、 (col1)10:00 - (col2)9:00 = 1:00 というような col1の時刻xx:xxとcol2の時刻yy:yyとを比較するために、col1の時刻だけが欲しくてCASTをしようとしていました。

関連するQ&A

  • DATE_TIME型での計算

    現在の日付から列A(DATETIME型)を引き 年数だけを取り出したいのですが どのようなSQL文を書けば可能でしょうか? SELECT (GETDATE() - 列A) AS 列A別名 FROM テーブル

  • sql文の中での時間取得

    sql文の中で以下のように時間を指定してselectしています。ですが、時間を「sqlの実行時間からn分前までの間」に修正したいと考えています。どなたかご教示いただけませんでしょうか。 select count(*) from tableA where hoge = '0000' and end_time >= cast('2000/1/01 00:00' as timestamp) and end_time < cast('2011/1/31 00:00' as timestamp) たとえば select count(*) from tableA where hoge = '0000' and end_time >= sqlを実施した時間から45分前 and end_time < sqlを実施した時間 のようにしたいです。 ご協力お願い致します。

  • SQLServerでREPLACE/SELECTができるか?

    My-SQLでは以下のSQLにより test01というDBからtest02というDBへ データをinsertすることができると思います。 また「insert」ではなく「replace」にすることで 同一キーの場合エラーにならず置き換えで データを登録してくれます。 ======================================= insert into [test01].dbo.test_table select * from [test02].dbo.test_table ======================================= そこで上記の「replace」を同じように SQLServerでできないか知っている方が おられたら是非ご教授いただきたく。 よろしくお願いいたします。

  • 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

  • 複数の副問合わせにて、一つだけデータがない場合の対処法は?

    テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。 そして以下のようなSQLを作りました。 SELECT TBLA.SURYO_1 ,TBLB.SURYO_2 , TBLC.SURYO_3 ,TBLD.SURYO_4 FROM (SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA, (SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB, (SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC, (SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は データがないことにより、SQLを実行すると、対象データがないという結果となります。 当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、 出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ を取得する方法はありますでしょうか? よろしくお願いします。

  • SQLで文字列を時刻に型変換する方法

    SQLで文字列を時刻に型変換する方法を教えていただきたいです。 char型のAというカラムに'090000'が格納されています。 この値を time型のBというカラムに型変換して登録したいのですが、 cast(A as time) としてもエラーが出てしまうので、現在は cast(SubString(A,1,2)+':'+SubString(A,3,2)+':'+SubString(A,5,2) as time) と変換しています。 もっと簡単に変換する方法はありますでしょうか? ご教示頂けましたら、助かります。 宜しくお願い致します。

  • ストアドでVB.NetのDataGridにDataTime型のデータの時間だけを返したいです。

    DBはMSDE。 肝心のフィールドはTimeでDateTime型で、以下のようなデータがあります。 Time 5:00:00PM 5:30:00AM . . これをストアドで返します。普通に SELECT Time ... 以下略。 クライアント側、sqlCommand -> パラメタ の設定 -> sqlDataAdapter -> DataSetにエントリを返し -> DataGrid1.DataSource = DataSet.Tables(0) これで、実行すると、返ってくる値は すべて 30/12/1899 となります。時間の部分は何も出ません。これはDB側に、日にちを入れてないので出てくるデフォルト値と思われます。 次に、前の SELECT文に CAST(sql_variant、Time) を加えると、30/12/1899 5:00:00PM と出ますが、sql_variant型なので、SABSTRINGで切れません、上のCAST文にさらにCONVERT(Varchar(30),,)をかぶせると、30/12/1899 に戻ってしまいます。 今まで試した方法は、 CONVERT(Varchar(30),Time,108) CONVERT(Varchar(30),Time,8) CONVERT(char(30),Time,108) CONVERT(Varchar(30),Time) EXTRACT (Time.....) 等などあらゆる方法(データ型のバリエーションを含む)を試みましたが、返されのは30/12/1899ばかりです。 DateTimeはDB側で比較のクエリに使用するのでをVCharに変えることはできません、Timeのデータにダミーの日にちを付け加えたくもありません。 なんとか時間だけを取る方法をご教授ください。お願いします。

  • SQLServerに接続できない

    SQLServerを別PCにて稼動させて、クライアントPCよりVBAにて接続を試みているのですが、「SQLServerが存在しないか、アクセスが拒否されました。」と出て、接続が出来ません。 何が問題なのか分からず、困っています。 どなたかご教授頂けないでしょうか。 (ローカルで接続する分には、接続が出来る事を確認しています。) また、環境は以下のような形です。 ServerPC名:AAA SQLバージョン:SQLServer2005Express ServerOS:Win2003Server ログイン用アドレス:TAROU クライアントのVBAは以下のような記載をしています。 ------- Dim strSQL As String Dim rsTmp As ADODB.Recordset Dim DB As String DB = "Provider=MSDASQL;Driver={SQL Server};" & "Server=AAA\SQLEXPRESS;" & "Database=TEST;" & "" Set rsTmp = New ADODB.Recordset strSQL = "SELECT * From TEST_TABLE" rsDeli.Open strSQL, DB, adOpenStatic, adLockOptimistic -----------------

  • InterBase(firebird)で固定文字列と文字列型フィールドのunionでエラー

    お世話になっております。 InterBase(firebird)のunionについての質問です。 あるテーブル(test_table)に test_cd VARCHAR(2) ; というような、文字列があるとします。 これを単純に抽出するSQL と、固定文字列を値の代用とするSQL をunionで求めようとした際に、以下のSQLで問い合わせました。 select test_cd from test_table where [条件] union select '00' test_cd from test_table where [条件] 問い合わせた際に以下のようなエラーが返ってきました。 Dynamic SQL Error SQL error code = -104 Invalid command Data type unknown それぞれのSQLは正しく返ってくるのですが、 unionで結合した際にこのエラーが返ってきます。 どのように対処すればよいのでしょうか、 ご回答をよろしくお願いいたします。

  • SQLserver算術オーバーフローエラーについて

    使用環境は DB SQL Server2008 Express 使用ツールは Microsoft SQL Server Management Studio です SQLserver2000からSQLserver2008DBへ移行しようとしているのですが ストアドプロシージャのところでうまくいきません 具体的には、処理を走らせると下記メッセージが出てきます floatをデータ型numericに変換中に、算術オーバーフローエラーが発生しました プロシージャ"○○"は、許可されていないステータスNULLを返そうとしました。 代わりにステータス0を返します 調べると  小数点以下があるフィールド同士を掛けて、その結果の小数点以下をROUNDで切り 捨てた値を小数点のないフィールドに追加しようとするとエラーになる  とありました。 下記 2行あたりが怪しいと思うのですが対処方法がわかりません。 ご教授願えないでしょうか? SET @GetRand = CAST(RAND()*10 AS numeric(1,0)) … SET @GetRand = CAST(RIGHT(CONVERT(varchar,CAST(RAND()*100 AS numeric(2,0))+100),2) As numeric(2,0)) またストアドプロシージャは、VBのようにデバッグで1行単位で処理を確認してい くことはできないのでしょうか?