【问题标题】:Storing the previous month as a char with a leading 0 for single digit months将上个月存储为一个字符,其中一位数月份以 0 开头
【发布时间】:2013-03-20 22:44:46
【问题描述】:

我有一个充满日期的字段,但它们存储为 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

【问题讨论】:

  • 幸运的是,您可以将这些字符串转换为日期,除非您有一些奇怪的值,例如“哦,亲爱的”。然后就是一个简单的 dateadd()。
  • @DanBracuk - 我建议作为答案!通过一些错误检查,甚至可以处理“哦,亲爱的”。
  • 是的,我的“哦,亲爱的”情况已经实现 - 从中​​剔除此日期的参数有时会在日志中出现问题,并且字段中有一堆文本。我现在需要想办法解决这个问题!感谢您为我指明正确的方向。

标签: sql sql-server-2008


【解决方案1】:

其实你需要把 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上的简单演示

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢!看起来我确实在该数据中有一个字符串。不过,这为我指明了正确的方向。我将研究找出处理这些情况的错误或找出如何忽略这些记录(无论如何我都不想计算)。任何提示将不胜感激。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多