1

後で比較できるように、日付変数を設定するために最善を尽くしています。基本的に次のようなものが欲しいのですが。

現在の日が11未満の場合、日付は先月の10日です
。現在の日が11以上の場合、日付は今月の10日です。

日付は2012年11月6日期待される出力です:

@PODate = 10/10/2012

日付は2012年11月16日期待される出力です:

@PODate = 11/10/2012

現在私が持っているのはこれだけです:

DECLARE @PODate as DATETIME
Set @PODate = Convert(varchar(8),GetDate(),1)

ヒントやヘルプをいただければ幸いです。ありがとうございました!!

4

4 に答える 4

2

できるだけ簡単に保つようにしています:

declare @PODate datetime
select @PODate = DATEADD(month,
   DATEDIFF(month,'20010110',CURRENT_TIMESTAMP) +
      CASE WHEN DATEPART(day,CURRENT_TIMESTAMP) <= 10 THEN -1 ELSE 0 END,
   '20010110')

周囲のDATEADD/DATEDIFFペアは、日付を当月の10日に正規化するために使用されています。次に、小さなCASE式を使用して、日が10日以下の場合に月を減算します。


どのソリューションを選択する場合でも、文字列操作として実行するソリューションは避けてください。datetimeSQLの関連するバグの通常の原因は、人々が日付を文字列として扱う場合です。これらの問題を防ぐには、通常、データ型を適切に保持することが最善の方法です。

確かに、私のソリューションには2つの文字列がありますが、これらは固定定数文字列であり(重要なのは、両方が同じ年と月であり、2番目の文字列は月の10日であるということです)、明確なフォーマット。

于 2012-11-07T08:35:36.493 に答える
1

これを試してください:SQL Fiddle

DECLARE 
    @PODate as DATETIME,
    @LastMonth as DateTime,
    @strDate as Varchar(50)

set @PODate = '11/16/2012'
set @LastMonth = DATEADD(MONTH, -1, @PODate)


if(DAY(@PODate) < 11)
   SET @strDate = CAST(MONTH(@LastMonth) AS VARCHAR)+'/10/'+CAST(YEAR(@LastMonth) AS VARCHAR)
else
   SET @strDate = CAST(MONTH(@PODate) AS VARCHAR)+'/10/'+CAST(YEAR(@PODate) AS VARCHAR)

Select CAST(@strDate AS DateTime)
于 2012-11-07T03:34:19.823 に答える
1
DECLARE @PODate date = '20121116'
SELECT CASE WHEN DATEPART(day, @PODate) < 11 THEN DATEADD(mm, DATEPART(mm, GETDATE()) - DATEPART(mm, @PODate) - 1, DATEADD(day, 10 - DATEPART(day, @PODate), @PODate))
                                             ELSE DATEADD(mm, DATEPART(mm, GETDATE()) - DATEPART(mm, @PODate), DATEADD(day, 10 - DATEPART(day, @PODate), @PODate)) END

SQLFiddleのデモ

于 2012-11-07T08:12:35.620 に答える
0
DECLARE @currDate DATE = dbo.GetDate()
DECLARE @day INT =  day(@currDate)
DECLARE @month INT 
DECLARE @year INT

DECLARE @PODate DATE

IF( @day >= 11)
BEGIN
    SET @month = month(@currDate)
    SET @year = year(@currDate)
END 
ELSE BEGIN
    SET @month =  month(dateadd(m,-1,@currDate))
    SET @year = year(dateadd(m,-1,@currDate))       
END

SET @PODate = convert(DATE,'10-' + convert(VARCHAR,@month) + '-' + convert(VARCHAR,@year))

PRINT    @PODate

の場合@currDate = '11-jan-2013'@PODate になり'10-jan-2013'、の場合@currDate = '07-jan-2013'@PODateになります'10-Dec-2012'

于 2012-11-07T03:32:24.287 に答える