3

次のコードを使用して、今週誕生日の人をリストしようとしています。

declare @START_DATE date;
set @START_DATE  = DATEADD(dd, 1 - DATEPART(dw, getdate()), getdate())
declare @END_DATE date;
set @END_DATE = DATEADD(dd,6, @START_DATE)
set DATEFIRST 1

SELECT  @START_DATE as StartDate, Personel.DogumTarihi , @END_DATE as EndDate
      ,[Adi]
      ,[Soyadi]
      ,[BirimAdi]
      ,[DogumTarihi]
      ,[MudurlukAdi]
      ,[Gorevi]
      ,[CepTelefonu]
      ,[EvTelefonu]
from Personel 
where (
      DATEPART(m, Personel.DogumTarihi) = DATEPART(m, @START_DATE) 
  and DATEPART(DAY, Personel.DogumTarihi) >= DATEPART(DAY, @START_DATE) 
  and DATEPART(DAY, Personel.DogumTarihi) <= DATEPART(DAY, @END_DATE)
  ) 
  OR (
      DATEPART(m, Personel.DogumTarihi) = (DATEPART(m, @START_DATE)+ 1) 
  and DATEPART(DAY, Personel.DogumTarihi) <= DATEPART(DAY, @END_DATE)
  )

まず、開始日を設定し、開始日に従って終了日を計算します。次に、月曜日を週の最初の曜日に設定しました。しかし、これを実行するたびに、異なる開始日が表示されます。私は Sql Scripting にまったく慣れていません。宣言で間違っている可能性がありますが、それを見つけることができませんでした。前もって感謝します。

4

5 に答える 5

2

わかりました、もう一度試してください:

where

case when year(@START_DATE) = year(@END_DATE) THEN '1' ELSE CASE WHEN month(@birthdate) = 12 THEN '0' WHEN month(@birthdate) = 1 THEN '1' ELSE '9' END END
+ RIGHT('0' + CONVERT(varchar(2), MONTH(@birthdate)),2)
+ RIGHT('0' + CONVERT(varchar(2), DAY(@birthdate)),2)

between

case when year(@START_DATE) = year(@END_DATE) THEN '1' ELSE '0' END
+ RIGHT('0' + CONVERT(varchar(2), MONTH(@START_DATE)),2)
+ RIGHT('0' + CONVERT(varchar(2), DAY(@START_DATE)),2)

and

'1'
+ RIGHT('0' + CONVERT(varchar(2), MONTH(@END_DATE)),2)
+ RIGHT('0' + CONVERT(varchar(2), DAY(@END_DATE)),2)
于 2012-06-27T08:23:57.093 に答える
2

これを試して:

SELECT  DATEADD(WEEK, DATEDIFF(DAY, 0, GETDATE())/7, 0) FirstDayOfCurrentWeek, 
        DATEADD(YEAR, DATEDIFF(YEAR, DogumTarihi, GETDATE()), [DogumTarihi]) BirthdayThisYear,
        DATEADD(WEEK, 1, DATEADD(WEEK, DATEDIFF(DAY, 0, GETDATE())/7, 0)) FirstDayOfNextWeek           
          ,[Adi]
          ,[Soyadi]
          ,[DogumTarihi]
          ,[BirimAdi]
          ,[MudurlukAdi]
          ,[Gorevi]
          ,[CepTelefonu]
          ,[EvTelefonu]         
FROM    Personel
WHERE   DATEADD(YEAR, DATEDIFF(YEAR, [DogumTarihi], GETDATE()), [DogumTarihi]) >= DATEADD(WEEK, DATEDIFF(DAY, 0, GETDATE())/7, 0)
        AND
        DATEADD(YEAR, DATEDIFF(YEAR, [DogumTarihi], GETDATE()), [DogumTarihi]) < DATEADD(WEEK, 1, DATEADD(WEEK, DATEDIFF(DAY, 0, GETDATE())/7, 0))
于 2012-06-27T08:34:07.860 に答える
1

sqlでは、週を直接指定できます

DATEPART(ww,GETDATE()) 

またはオラクルで: to_char( mydate, 'ww' )

于 2012-06-27T09:00:35.130 に答える
1

私の問題に対処するために、回答に従って上記のコードを修正しました。

set DATEFIRST 1
declare @START_DATE date;
set @START_DATE  = DATEADD(dd, 1 - DATEPART(dw, getdate()), getdate())
declare @END_DATE date;
set @END_DATE = DATEADD(dd,6, @START_DATE)


SELECT  @START_DATE as StartDate, 

(case when 
(DATEPART(m, @START_DATE) = DATEPART(m, @END_DATE))
then 
(case when (DATEPART(DAY, Personel.DogumTarihi) >= DATEPART(DAY, @START_DATE) and DATEPART(DAY, Personel.DogumTarihi) <= DATEPART(DAY, @END_DATE)) then Personel.DogumTarihi else 0 end)
else 
    (case when DATEPART(m, Personel.DogumTarihi) = DATEPART(m, @START_DATE)
        then
            (case when (DATEPART(DAY, Personel.DogumTarihi) >= DATEPART(DAY, @START_DATE)) then Personel.DogumTarihi else 0 end)
        else
            (case when (DATEPART(DAY, Personel.DogumTarihi) <= DATEPART(DAY, @END_DATE)) then Personel.DogumTarihi else 0 end)
        end
    )
end), 
@END_DATE as EndDate, [TCKN]
      ,[Adi]
      ,[Soyadi]
      ,[BirimAdi]
      ,[DogumTarihi]
      ,[MudurlukAdi]
      ,[Gorevi]
      ,[CepTelefonu]
      ,[EvTelefonu]
      ,[VakifTelefonu]
from Personel where 
DATEPART(m, @START_DATE) = DATEPART(m, @END_DATE)
OR DATEPART(m, Personel.DogumTarihi) = DATEPART(m, @START_DATE)
OR DATEPART(m, Personel.DogumTarihi) = DATEPART(m, @END_DATE)

「月の開始日と終了日が同じ週(今週など)」の場合を考慮しています。正しい結果をもたらしているようです..

于 2012-06-27T11:43:35.237 に答える
1

試してみましょう:

declare @today datetime

set @today = getdate()
-- erase the hours
set @today = dateadd(hh, -datepart(hh, @today), @today)
-- erase the minutes
set @today = dateadd(mi, -datepart(mi, @today), @today)
-- erase the seconds    
set @today = dateadd(ss, -datepart(ss, @today), @today)
-- erase the milliseconds    
set @today = dateadd(ms, -datepart(ms, @today), @today)

-- go to start of current week (sunday!)    
set @today = dateadd(dd, 1-datepart(dw, @today), @today)

select * from MYTABLE
where DATECOL between 
  dateadd(yy, datepart(yy, DATECOL) - datepart(yy, @today), @today) and 
  dateadd(d, 7, dateadd(yy, datepart(yy, DATECOL) - datepart(yy, @today), @today))

どうやら SqlServer 2012 には DATEFROMPARTS 関数があるようです。2005 年には、この回り道を使用して日付をトリミングする必要があります。

誕生日を選択するには、「今日の年」をレコードの年に置き換えます。範囲の終了日については、それに 7 日を追加します。日曜日の 0:00 から土曜日の 23:59 までを検索することに注意してください。

週の途中で新しい年が始まり、希望する誕生日がその年である場合、これはおそらくまだ失敗します。

于 2012-06-27T12:13:30.470 に答える