将上个月存储为char,前导数为0,表示单个数字月份

时间:2013-03-20 22:44:46

标签: sql sql-server-2008

我有一个填充日期的字段,但它们存储为varchars。它们采用以下格式:

  • 01312013
  • 01302013
  • 09232007

我正在尝试编写一个只返回符合以下三个条件的记录的查询:

  • 上述varchar“日期”的最后四个字符与上一个月的年份匹配
  • 上述varchar“date”的前两个字符与上个月匹配。
  • 完全不同的日期字段中的值(实际存储为日期)属于上个月

我的尝试让我试图将上个月和上个月的年份存储在两个变量中,然后对varchar“date”执行LEFT()和RIGHT()查找以查看它们是否与这两个变量匹配变量。呼。

问题是MONTH存储为单个数字,我需要将其存储为“0”+月份数字(仅在单个数字的情况下)。它也没有在一年中工作所以也许完全没有。真的希望有人可以帮忙!

这是我到目前为止所拥有的:

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

2 个答案:

答案 0 :(得分:0)

幸运的是,您可以将这些字符串转换为日期,除非您有一些奇怪的值,例如'哦亲爱的'。那么这是一个简单的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

答案 1 :(得分:0)

实际上,您需要将varchar“date”转换为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

上的简单演示