0

イベントと日付を保持するテーブルが 1 つあります。

 NAME  | DOB
 -------------------
 Adam  | 6/26/1999
 Barry | 7/18/2005
 Daniel| 1/18/1984

日付範囲を開始時間または終了時間として定義する別のテーブルがあり、それぞれに説明的なコードがあります。

 CODE      | DATE
 ---------------------
 YearStart| 6/28/2013
 YearEnd  | 8/14/2013

2 番目の表に記載されている開始時刻と終了時刻の間にあるすべての生年月日を検索する SQL を作成しようとしています。YearStart は常に 6 月で、YearEnd は常に 8 月です。私の考えは試してみることでした:

 SELECT 
      u.Name
      CAST(MONTH(u.DOB) AS varchar) + '/' + CAST(DAY(u.DOB) AS varchar) as 'Birthdate',
      u.DOB as 'Birthday'
 FROM 
      Users u
 WHERE
      MONTH(DOB) = '7' OR
      (MONTH(DOB) = '6' AND DAY(DOB) >= DAY(SELECT d.Date FROM Dates d WHERE d.Code='YearStart')) OR
      (MONTH(DOB) = '8' AND DAY(DOB) <= DAY(SELECT d.Date FROM Dates d WHERE d.Code='YearEnd')))
 ORDER BY
      MONTH(DOB) ASC, DAY(DOB) ASC

内部の SELECT ステートメントが 1 つの行のみを返すという保証がないため、datetime として解析できないためです。このクエリを実際に実行するにはどうすればよいですか?

4

3 に答える 3

0

このように、PIVOT を使用して同じ行の年を取得してみてください。これは「ボブ」のみを返します

DECLARE @Names TABLE(
NAME VARCHAR(20),
DOB VARCHAR(10));

DECLARE @Dates TABLE(
CODE VARCHAR(20),
THEDATE VARCHAR(10));

INSERT @Names (NAME,DOB) VALUES ('Adam', '6/26/1999');
INSERT @Names (NAME,DOB) VALUES ('Daniel', '1/18/1984');
INSERT @Names (NAME,DOB) VALUES ('Bob', '7/1/2013');

INSERT @Dates (CODE,THEDATE) VALUES ('YearStart', '6/28/2013');
INSERT @Dates (CODE,THEDATE) VALUES ('YearEnd', '8/14/2013');

SELECT * FROM @Names;
SELECT * FROM @Dates;

SELECT n.*
FROM @Names AS n
INNER JOIN (
    SELECT
            1 AS YearTypeId 
          , [YearStart]
          , [YearEnd]      
    FROM    ( SELECT    [CODE]
                      , THEDATE
              FROM      @Dates
            ) p PIVOT ( MIN(THEDATE)
                        FOR [CODE] 
                          IN ([YearStart],[YearEnd])
                      ) AS pvt) AS y
ON 
    n.DOB >= y.YearStart 
    AND n.DOB <= y.YearEnd       
于 2013-07-16T17:14:17.567 に答える