- PR -

SqlServerで期間内の日付を取得するには?

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 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を活用したいと考えています。

皆様の書き込みありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)