我有一个填充日期的字段,但它们存储为varchars。它们采用以下格式:
我正在尝试编写一个只返回符合以下三个条件的记录的查询:
我的尝试让我试图将上个月和上个月的年份存储在两个变量中,然后对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
答案 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())
上的简单演示