• 締切済み

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だと関数などたくさん使用しており 時間がかかってしょうがありません。 ※特に日付関連の部分 なにかいいアドバイスがある方、宜しくお願い致します。

みんなの回答

  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

プログラム上から利用しているのでしょうか・・・ 手で打っているのであれば、何の問題も発生しませんよね。 つまり'1999/11/01' and '2003/02/28'で。 プログラムから利用するのであれば、SQLを発行する前に '1999/11/01','2003/02/28'を生成する処理を入れるだけでしょう。 どの言語を使っているか知りませんが。 SQLでやるのであれば、ホスト変数などを使えばできると思いますよ。

  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

??? ただ単にhizukeと比較でいいのでは? select name, address, hizuke from test_tbl where hizuke between '1999/11/02' and '2003/02/16' なにか問題でも・・・

jyopper
質問者

補足

返信ありがとうございます。 上記でも問題はありませんが、この場合年月日の検索のみ適用できるようです。 検索対象期間を1999年11月から2003年2月にすると、 select name, address, hizuke from test_tbl where hizuke between '1999/11' and '2003/02' とすると正しいデータが返ってきません。

関連するQ&A

  • 日付検索で0000-00-00 00:00:00を除外したい

    日付検索で0000-00-00 00:00:00を除外したい mysql5.0 データ型はdatetimeで日付検索をしたのですが、 日付が"0000-00-00 00:00:00"で登録されているデータも 検索結果に表示され困っています。 例えば、 SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') →これだと、hizukeが0000-00-00 00:00:00のデータも表示されてしまいます。 日付が0000-00-00 00:00:00で登録されているデータを除外するため 自分もいろいろしてみたのですができません。どなたか教えていただけないでしょうか。 参考までに、自分が試したsql文を書きます。↓ SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke != '0000-00-00 00:00:00') SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke <> '0000-00-00 00:00:00') SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke not in ('0000-00-00 00:00:00')) →上記載のsqlはすべて検索件数が0になってしまいました。 もうわからなくなってしまったので、アドバイスお願いします。

    • ベストアンサー
    • MySQL
  • mysqlで日付が比較できない・・・

    はじめまして 皆様の知恵を貸してください mysqlでの質問なのですが、 簡潔にいうと日付が比較できません。 どういうことをしたいのかというとsqlからwhere文で今の日付より大きいもデータを抽出するということです データベースの構造は id int型 endtime datetime型 で構成されています endtimeには既にいくつかのdatetime型の値が入っています 例えば 2012-12-14 09:18:00 のように入っています でGETDATE()関数を使って今現在の時刻より未来のものだけ抽出するために convert関数を使って一度varchar型に変換することで比較しようとしました 色々インターネットで調べた結果次のような文なのではないかと考えました select id,endtime from [データベース名] where CONVERT(VARCHAR,endtime,121)>=CONVERT(VARCHAR,getdate(),121); しかし実行ができません 比較する方法を教えて欲しいです

    • ベストアンサー
    • MySQL
  • SQLSeverでのSQL文について

    こんにちは。質問させてください。 今、PHPでSQLSeverのデータを取得しようと考えています。 テーブル(test_tbl)はname(varchar型)、hizuke(datetime型)の2列で 構成されていて 12月のデータを取得したいと考えています。 select name, hizuke from test_tbl where datename(month,hizuke) = '12'; と上記のようにしたいのですが、SQLSeverのクエリーアナライザーでは 正常にデータを取得できましたが、PHPのソースで記述したほうは 検索データを1件も取得することができませんでした。 今度はwhere句以降のdatename関数部分を datename(month, hizuke) = 'December'と記述すると PHPでの方は正常に複数行取得することができます。 datename(year, hiduke) ->'2002', datename(day, hiduke) ->'26'なのに、 なぜ datename(month, hizuke) は'12'でなくて 'December'になってしまうのでしょうか? CONVERTなど色々と他の関数はありますが、 datename関数を使用したいと考えています。 どうぞ、宜しくお願いいたします。

  • SQLServerのテーブルについて

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

  • 日付型→文字列

    SQLServer2005の環境にて、 日付型の項目(YYYY/MM/DD HH:MM:SS)から日付のみを抽出したい場合、 現在SUBSTRING(CONVERT(VARCHAR,AA),1,10) と変換を行っているのですが、結果が「MM DD YYYY」となってしまいます。 「YYYY/MM/DD」の形式で取得するにはどのようなSQL文にすればよろしいのでしょうか。

  • 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を発行できる環境があればいいのですが、 宜しくお願いいたします。

  • SQLServer2005 メンテナンスプランについて

    SQLServer2005の管理、メンテナンスプランについての質問です。 互換性レベル7.0で運用しているDBのバックアップタスクを作成したいと思っています。 ツールボックスから「データベースのバックアップタスク」を使用すると、対象のDBとしてリストに表示されないため、 「T-SQLの実行タスク」を作成し、ステートメントに以下のように記述しました。バックアップは正常終了するのですが。。。 -------------------クエリここから----------------- BACKUP DATABASE [DB_NAME] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_200901151519.bak' WITH NOFORMAT, NOINIT, NAME = N'DB_NAME_backup_20090115151905', SKIP, REWIND, NOUNLOAD, STATS = 10 GO declare @backupSetId as int select @backupSetId = position from msdb..backupset where database_name=N'DB_NAME' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'DB_NAME' ) if @backupSetId is null begin raiserror(N'確認に失敗しました。データベース ''DB_NAME'' のバックアップ情報が見つかりません。', 16, 1) end RESTORE VERIFYONLY FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_200901151519.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND -------------------クエリここまで----------------- ここで、問題なのは、バックアップファイル名の指定が「DB_NAME_backup_200901151519.bak」固定であることです。 実行日時を取得してファイル名を生成するため、以下のように引数の「DISK」と「NAME」を変数で指定するように変更しました。 しかし、クエリの実行をすると、メッセージに以下のエラーが出力され、実行できません。 引数の渡し方が誤っているのでしょうか? 宜しくご教授願います。 -------------------変更後クエリここから----------------- DECLARE @TODAY VARCHAR(30); DECLARE @YYYY VARCHAR(4); DECLARE @MM VARCHAR(2); DECLARE @DD VARCHAR(2); DECLARE @HH VARCHAR(2); DECLARE @M VARCHAR(2); DECLARE @S VARCHAR(2); DECLARE @DISK VARCHAR(200); DECLARE @NAME VARCHAR(100); set @TODAY = convert(varchar, GETDATE(), 121); set @YYYY = SUBSTRING(@TODAY, 1, 4); set @MM = SUBSTRING(@TODAY, 6, 2); set @DD = SUBSTRING(@TODAY, 9, 2); set @HH = SUBSTRING(@TODAY, 12, 2); set @M = SUBSTRING(@TODAY, 15, 2); set @S = SUBSTRING(@TODAY, 18, 2); set @DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_'+@YYYY + @MM + @DD + @HH + @M +'.bak'; set @NAME = N'DB_NAME_backup_'+@YYYY + @MM + @DD + @HH + @M + @S; print 'DISK:'+@DISK print 'NAME:'+@NAME BACKUP DATABASE [DB_NAME] TO DISK = @DISK WITH NOFORMAT, NOINIT, NAME = @NAME, SKIP, REWIND, NOUNLOAD, STATS = 10 GO declare @backupSetId as int select @backupSetId = position from msdb..backupset where database_name=N'DB_NAME' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'DB_NAME' ) if @backupSetId is null begin raiserror(N'確認に失敗しました。データベース ''DB_NAME'' のバックアップ情報が見つかりません。', 16, 1) end RESTORE VERIFYONLY FROM DISK = @DISK WITH FILE = @backupSetId, NOUNLOAD, NOREWIND -------------------変更後クエリここまで----------------- -------------------メッセージここから------------------- DISK:C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_200901211339.bak NAME:DB_NAME_backup_20090121133912 メッセージ 137、レベル 15、状態 2、行 1 スカラ変数 "@DISK" を宣言してください。 メッセージ 137、レベル 15、状態 2、行 4 スカラ変数 "@DISK" を宣言してください。 -------------------メッセージここまで------------------- 以上、よろしくお願い致します。

  • プロシージャで変数をテーブル名として使用したい

    いつもお世話になります。 以下のような感じで変数をテーブル名として参照したいのですが、できますでしょうか。 --ここから create proc proc_test @tbl_name varchar(30) as select count(*) from [dbo].[@tbl_name] --ここまで ver:SQL Server2000 宜しくお願いいたします。

  • SQL の Update文(?) と substring  について

    SQLで、filed1において、13桁目から6桁に AAA と入っているものを、 BBB と置き換えたいのですが、うまくいきません。 作った文 update  Table-1  set SUBSTRING(filed1,13, 6)= 'BBB' where SUBSTRING(filed1,13, 6) like '%AAA%' これだと Line 1: Incorrect syntax near '('. というエラーメッセージが出ます。 どの様にすれば うまくいきますか? よろしくお願いします。

  • アプリから受け取った文字列を日付型に出来ない

    いつもお世話になっています。 タイトルにもあります通り、 アプリから受け取った文字列の日付型変換が上手くいかず失敗します。 状況は下記です。 SQL SERVER 2005に、 アプリから2っの文字列を受け取り、その文字列を日付型に変換し、 日付範囲検索をする。といったストアドを作成しました。 アプリ開発環境はVisualStudio2008、C#のウィンドゥズフォームです。 ストアド自体はManagement Studio上で日付型変換可能な 文字列2っを渡し、単体で実行すると期待通りの動作をします。 しかしアプリから文字列を受け取り実行すると、 「文字列から datetime 型に変換中、変換に失敗しました。」 というエラーがアプリ側に返されます。 しかし、この時アプリが渡す文字列をコピー&ペーストで ManagementStudioのクエリデザイナで実行すると上手く行きます。 アプリから日付変換前の文字列を渡す時に必要な何かが抜けているのでしょうか?ご教授お願いします。 ---ストアドを呼ぶアプリ側--- string kaishibi; string syuryobi; kaishibi += "1753/01/01"; syuryobi += "9999/12/31"; System.Data.SqlClient.SqlCommand hCommand = cSqlConnection.CreateCommand(); hCommand.CommandText = "EXECUTE [ストアド名] kaishibi,syuryobi"; System.Data.SqlClient.SqlDataReader cReader = hCommand.ExecuteReader(); (ここでエラー、「文字列から datetime 型に変換中、変換に失敗しました」) --ストアド側-- ALTER PROCEDURE [ストアド名]  @startData VARCHAR(50),  @endData VARCHAR(50) DECLARE @kaishibi DATETIME, @syuuryoubi DATETIME SET @kaishibi = CONVERT(VARCHAR,@startData,120) SET @syuuryoubi = CONVERT(VARCHAR,@enddata,120) SELECT LOGNO FROM LOG_TBL WHERE DateTime between @kaishibi and @syuuryoubi