2

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

  • 01312013
  • 01302013
  • 09232007

我正在尝试编写一个仅返回满足以下三个条件的记录的查询:

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

我的尝试使我试图将上个月的年份和上个月的年份存储在两个变量中,然后对 varchar“日期”执行 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
4

2 回答 2

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 回答
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上的简单演示

于 2013-03-20T23:51:29.997 回答