@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

SQLの抽出条件について

投稿者投稿内容
JT
常連さん
会議室デビュー日: 2005/10/20
投稿数: 27
投稿日時: 2006-07-19 21:50
お世話になっております。

SQL文の書き方についてわからないことがあり
投稿させて頂きました。

(例)
sqldata = "SELECT 登録日時 FROM TBL_ウェハ使用履歴 WHERE ウェハロットNo = '" & Me.ComboWaferLot.Text & "' "
上記、SQL文にもう一つ抽出条件として
その日の週(月〜日)という条件を加えたいのですが
どの関数、どういう書き方をすればよいのか
悩んでいます。
ネットや本などで調べたのですが、
厳しい状況でして。

どなたか教えて頂けないでしょうか。
どうぞ宜しくお願い致します。

platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2006-07-19 22:43
厳しい状況でして と 安易に言うな と言いたいが。。。
理由:この程度 ネット検索で調べりゃすぐわかるだろうに。。。
実際 Oracle 日付 関数 SQL 曜日 の5つのキーワードでGoogleで3番目に出てきたぞ。

SELECT
ROUND(NEXT_DAY(sysdate,'日曜日'),'DAY')-6 as 今週月曜日 ,
ROUND(NEXT_DAY(sysdate,'日曜日'),'DAY') as 次週日曜日 FROM DUAL

=========== 訂正加筆 ===========

なぜか勝手に、Oracleと決め付けてしまっていた。
この点は申し訳ない。
とはいえ、元の質問において、DB系の質問なのに
DBMSが何か書いていないんだな・・・・・・。

[ メッセージ編集済み 編集者: platini 編集日時 2006-07-19 23:21 ]
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-07-19 22:59
もう一つは 呼び出し側で週の初めの日と終わりの日を計算して
その値を範囲指定するやり方もある

where
日>='04/05/01' and 日<='04/05/05'
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-07-20 01:27
同じ週ということで年における週番号が一致するデータを取得すればいいのではないでしょうか?
登録日時(?)の週番号とその日(システム日付?)の週番号が一致するものって条件を書いてあげたらいいかと思います。


Oracleの場合
コード:
select to_char(to_date('20060715','yyyymmdd'),'ww') from dual ;
(結果) 
28

select to_char(to_date('20060716','yyyymmdd'),'ww') from dual ;
(結果) 
29

select to_char(to_date('20060722','yyyymmdd'),'ww') from dual ;
(結果) 
29

select to_char(to_date('20060729','yyyymmdd'),'ww') from dual ;
(結果) 
30



SQL Serverの場合
コード:
select datepart(week , convert(datetime, '060715',112)) ;
(結果) 
28

select datepart(week , convert(datetime, '060716',112)) ;
(結果) 
29

select datepart(week , convert(datetime, '060722',112)) ;
(結果) 
29

select datepart(week , convert(datetime, '060723',112)) ;
(結果) 
30



PostgreSQLの場合
(日曜を週頭と考える場合)
コード:
select 	
  extract('week' from d) +
  case when extract('dow' from d) = 0 then 1 else 0 end 
from ( select to_date('20060715','yyyymmdd') as d) t  ;
(結果) 
28

select 	
  extract('week' from d) +
  case when extract('dow' from d) = 0 then 1 else 0 end 
from ( select to_date('20060716','yyyymmdd') as d) t  ;
(結果) 
29

select 	
  extract('week' from d) +
  case when extract('dow' from d) = 0 then 1 else 0 end 
from ( select to_date('20060722','yyyymmdd') as d) t  ;
(結果) 
29

select 	
  extract('week' from d) +
  case when extract('dow' from d) = 0 then 1 else 0 end 
from ( select to_date('20060723','yyyymmdd') as d) t  ;
(結果) 
30



MySQLの場合
(日曜日を週の最初とした場合)
コード:
select date_format("2006-07-15","%V") ;
(結果) 
28

select date_format("2006-07-16","%V") ;
(結果) 
29

select date_format("2006-07-22","%V") ;
(結果) 
29

select date_format("2006-07-23","%V") ;
(結果) 
30



_________________
夏椰 @ わんくま同盟
夏椰の庵
Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 )
マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-07-20 21:02
夏椰さんこんにちは。

引用:

夏椰さんの書き込み (2006-07-20 01:27) より:
同じ週ということで年における週番号が一致するデータを取得すればいいのではないでしょうか?
登録日時(?)の週番号とその日(システム日付?)の週番号が一致するものって条件を書いてあげたらいいかと思います。



SQL Server 2000で試した限りですが(←追記)
この方法では年を正しく処理できません。
例えば下記の様なケースです。

1.年末年始にまたがった週の時
  -> 年末と年始では別の週として扱われる。

2.昨年などの過去の日付も存在する時
  -> 年が違っても同じ週として扱われる。


platiniさんの例の様に、週初日となる月曜の日付を使用する方法が適当と思います。

SQL Server 2000、SET DATEFIRSTを使用しない時に、その週の月曜日(週初日)を求める場合。
コード:

CONVERT( varchar, DATEADD(day, - ((DATEPART(weekday, 登録日時) + 5) % 7), 登録日時), 111)



または
コード:

DATEADD(day, - ((DATEPART(weekday, 登録日時) + 5) % 7), CONVERT(varchar, 登録日時, 111))



[ メッセージ編集済み 編集者: マー帽 編集日時 2006-07-20 21:08 ]

[ メッセージ編集済み 編集者: マー帽 編集日時 2006-07-20 21:10 ]

[ メッセージ編集済み 編集者: マー帽 編集日時 2006-07-20 23:26 ]
JT
常連さん
会議室デビュー日: 2005/10/20
投稿数: 27
投稿日時: 2006-07-20 21:42
Wafer Slice 数量 登録日時
AA 1 400 2006/7/12
AA 2 400 2006/7/13
AA 3 400 2006/7/14
AA 4 400 2006/7/17
AA 5 400 2006/7/18
AA 6 500 2006/7/19
AA 7 500 2006/7/20
AA 8 500 2006/7/21
AA 9 500 2006/7/22
AA 10 500 2006/7/23

上記、例のデータから23日(日)に抽出処理を行うとしたらその週の月曜日から日曜日のデータを抽出できるようにしたいのです。ということは7/17〜23のデータ。

sqldata = "SELECT 登録日時 FROM TBL_ウェハ使用履歴 WHERE ウェハロットNo = '" & Me.ComboWaferLot.Text & "' " & _
AND 今週の月曜日から今週の日曜日"

というの自分のやりかったことでして、
”今週の月曜日から今週の日曜日”の書き方わからず困っていました。

マー帽様
sqldata = "SELECT 登録日時 FROM TBL_ウェハ使用履歴 WHERE ウェハロットNo = '" & Me.ComboWaferLot.Text & "' " & _
AND DATEADD(day, - ((DATEPART(weekday, 登録日時) + 5) % 7), CONVERT(varchar, 登録日時, 111))"

の処理方法でいんでしょうか?

今は社外なので確認することができないのですが。。




マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-07-20 22:10
JTさん、こんばんは。

引用:

JTさんの書き込み (2006-07-20 21:42) より:

”今週の月曜日から今週の日曜日”の書き方わからず困っていました。



登録日時に時刻の情報が含まれているかどうかによりますが、
下記の様に記述すれば、一応実現すると思います。


登録日時に時刻が含まれている時(月曜以上、翌週月曜未満)
コード:
登録日付 >= DATEADD(day, - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111)) AND 
登録日付 <  DATEADD(day, 7 - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111))



登録日時に時刻が含まれていない時(月曜から日曜まで)
コード:
登録日付 BETWEEN DATEADD(day, - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111))
         AND     DATEADD(day, 6 - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111))



ですが、もし私が同じ事をするのであれば、
月曜と日曜の日付をプログラムで求めて七味唐辛子さんの案で検索します。
上記の方法がスマートだとは思えませんので・・・
JT
常連さん
会議室デビュー日: 2005/10/20
投稿数: 27
投稿日時: 2006-07-20 22:59
登録日時に時刻の情報が含まれているかどうかによりますが、
下記の様に記述すれば、一応実現すると思います。
時刻は含まれています。

登録日時に時刻が含まれている時(月曜以上、翌週月曜未満)
コード:
登録日付 >= DATEADD(day, - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111)) AND 
登録日付 <  DATEADD(day, 7 - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111))



上記の方法で処理をしてみました。
sqldata = "SELECT 登録日時 FROM AXIS.DK_TBL_ウェハ使用履歴 WHERE ウェハロットNo = '" & Me.ComboWaferLot.Text & "' " & _
"AND 登録日時 >= DATEADD(day, - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111)) " & _
"AND 登録日時 < DATEADD(day, 7 - ((DATEPART(weekday, GETDATE()) + 5) % 7), CONVERT(varchar, GETDATE(), 111))"

SQL実行時にエラーが出てしまいました。
ORA-00911:文字が無効です。

すみません、まだまだ未熟なものですがご指摘をお願いします。

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