2

日付で満たされたフィールドがありますが、それらはvarcharsとして保存されます。それらは次の形式です。

  • 01312013
  • 01302013
  • 2007年9月23日

次の3つの条件を満たすレコードのみを返すクエリを作成しようとしています。

  • 前述のvarchar「date」の最後の4文字は、前月の年と一致します
  • 前述のvarchar「date」の最初の2文字は、前月と一致します。
  • まったく異なる日付フィールド(実際には日付として保存されている)の値は、前月に含まれます

私の試みでは、前月と前月の年を2つの変数に格納し、varchar "date"に対してLEFT()およびRIGHT()ルックアップを実行して、これら2つの変数と一致するかどうかを確認しようとしました。ふぅ。

問題は、MONTHが1桁で格納されていることであり、「0」+月の桁(1桁の月の場合のみ)として格納する必要があります。また、それは1年だけも機能していないので、おそらくこれは完全にオフになっています。誰かが助けてくれることを本当に願っています!

これが私がこれまでに持っているものです:

DECLARE @monthAgo dateTime
DECLARE @MonthString char
DECLARE @YearString char

SET @monthAgo = DATEADD(month, -1, GETDATE())
SET @MonthString = MONTH(@monthAgo) -- not working
SET @YearString = YEAR(@monthAgo) -- not working

SELECT 
    COUNT(*)
FROM
    jwemaildb.LogFileRecords
WHERE
    date > = DATEADD(month, DATEDIFF(month, 0, GETDATE())-1, 0) AND
    date <  DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AND
    RIGHT(eAlertSentDate, 4) = @YearString AND
    LEFT (eAlertSentDate, 2) = @MonthString
4

2 に答える 2

0

実際には、varcharの「日付」をISO標準に変換する必要があります

SELECT COUNT(*)
FROM jwemaildb.LogFileRecords
WHERE
    date > = DATEADD(month, DATEDIFF(month, 0, GETDATE())-1, 0) AND
    date <  DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AND
    CAST(RIGHT(eAlertSentDate, 4) + LEFT(eAlertSentDate, 4) AS date) BETWEEN       
    DATEADD(dd , 1 - DAY(GETDATE()), DATEADD(mm, -1 ,GETDATE())) AND
    DATEADD(dd , 1 - DAY(GETDATE()), GETDATE())

SQLFiddleの簡単なデモ

于 2013-03-20T23:51:29.997 に答える
0

幸い、「oh dear」などの奇妙な値がない限り、これらの文字列を日付としてキャストできます。次に、それは単純なdateadd()です。

それが機能することを確認するためだけに:

 declare @dateString as char(8);
 set @dateString = '02132013';

 select cast(left(@dateString, 2) + '/' + 
 substring(@dateString, 3,2) +'/' +   
 right(@dateString, 4) as date) theDate;

戻り値

theDate
2013-02-13
于 2013-03-20T23:48:36.267 に答える