- ひろれい
- ぬし
- 会議室デビュー日: 2006/03/02
- 投稿数: 486
- お住まい・勤務地: 万博開催地
|
投稿日時: 2008-06-17 17:32
引用: |
|
gorisakuさんの書き込み (2008-06-17 17:24) より:
皆様 早速のご回答ありがとうございます。
crab殿
Storedでやはり実現しないと無理でしょうか?
(Storedでは実現できると判断しているのです)
ひろれい殿
SELECT CURRENT_TIMESTAMP
ではその日しか求めることができないと思っています。
出来ればWHERE句などを使用して日付の指定を行いたいと考えています。
PGでの使用用途については、
C#よりSQLを投げ、結果として返ってきた内容を
Dataset内DataTableに
格納するというのが目標となります。
当然C#でソースを記述すれば実現可能なのはわかっていますが
出来る限りSQLで実現したいと思っています。
|
やっと、回答者が回答できる条件が揃った気がします・・・
最初の「5レコード取得したい」は通常の WHERE 句 で可能なのはもう既に分かっていらっしゃるんですよね?
「対象年月を指定した場合」は 対象年月を条件指定した上で、DISTINCT で絞って出来ないですかね?
|
- gorisaku
- ベテラン
- 会議室デビュー日: 2004/04/17
- 投稿数: 95
|
投稿日時: 2008-06-17 17:35
ひろれい殿 ご回答ありがとうございます。
引用: |
|
やっと、回答者が回答できる条件が揃った気がします・・・
最初の「5レコード取得したい」は通常の WHERE 句 で可能なのはもう既に分かっていらっしゃるんですよね?
「対象年月を指定した場合」は 対象年月を条件指定した上で、DISTINCT で絞って出来ないですかね?
|
DISTINCTで絞るべきテーブルが存在しない検索になるので
絞りようがないのです・・・
実態のテーブルからではなくOracleでいうDual表的なものから
取得したいと考えています。
やはりStoredですかね?
|
- rain
- ぬし
- 会議室デビュー日: 2006/10/19
- 投稿数: 549
|
投稿日時: 2008-06-17 17:35
↓参考になるかもしれないURLです。
http://japan.internet.com/developer/20071113/26.html
単純に思いつくところでは、1900/1/1 〜 9999/12/31 までの日付を格納したテーブルを用意して、それに対して検索をかけると出るのかな、と。
もう1つは、num列に 1 〜 (十分大きな数) までの数値を格納した sequence テーブルを用意して、こんなクエリを実行するといいのかな。
# 脳内ではじき出しただけなので、動かなくても怒らないでください。
コード: |
|
# @dt1:範囲の開始日付, @dt2:範囲の終了日付
SELECT
DATEADD(dd, num - 1, @dt1) AS [day]
FROM
sequence
WHERE
num <= DATEDIFF(dd, @dt2, @dt1) + 1
|
月内に関しては、範囲の終わりの日付を DATEADD(dd, -1, DATEADD(mm, 1, @dt1)) で求めてあげるとよいかと思います。
…と書いてみましたが、SQLServer にはあまり詳しくないので gorisakuさんが本当に求めている回答は提示できそうにありません。
ストアドならできそうな気はします。
[ メッセージ編集済み 編集者: rain 編集日時 2008-06-17 17:57 ]
|
- ノラ
- 常連さん
- 会議室デビュー日: 2003/11/06
- 投稿数: 37
- お住まい・勤務地: 東京都
|
投稿日時: 2008-06-17 20:06
再帰SQLを使うとか
コード: |
|
with t as
( select cast( '2008/5/1' as datetime ) as hizuke
union all
select dateadd( day, 1, hizuke )
from t
where t.hizuke < '2008/5/30' )
select hizuke from t;
|
|
- 忠犬
- 大ベテラン
- 会議室デビュー日: 2006/05/01
- 投稿数: 109
|
投稿日時: 2008-06-17 20:06
他の方も答えていますが、存在しないものを検索しようがありません。
検索するには、事前にカレンダー表といったものを作っておくか、SELECT文で
無理矢理、一時的に作るしかありません。
例えば、こんな馬鹿げたSQLになります。
コード: |
|
select *
from
(select '2008-06-01' as hiduke
union
select '2008-06-02' as hiduke
union
〜中略〜
select '2008-06-30' as hiduke) as x
|
通常、稼働日や休業日などの管理などで、カレンダー表といったものを作る場合は
多いと思いますが?
|
- gorisaku
- ベテラン
- 会議室デビュー日: 2004/04/17
- 投稿数: 95
|
投稿日時: 2008-06-18 09:28
皆様ご回答ありがとうございます。
引用: |
|
ノラさんの書き込み (2008-06-17 20:06) より:
再帰SQLを使うとか
コード: |
|
with t as
( select cast( '2008/5/1' as datetime ) as hizuke
union all
select dateadd( day, 1, hizuke )
from t
where t.hizuke < '2008/5/30' )
select hizuke from t;
|
|
上記の再帰SQLが私の理想とする回答になっておりました。
上記SQLを活用したいと考えています。
皆様の書き込みありがとうございました。
|