我正在尝试将结果从INT列转换为DATE,因此GETDATE函数将与此列兼容。日期目前的格式为yyyymmdd
这是我到目前为止基于我能找到的东西,但我确信这是完全错误的
...AND (dbo.V_HEAD.LF_DATE CONVERT(DATE,(CONVERT(INT, LF_DATE)) >= GETDATE-28)
AND (dbo.V_HEAD.LF_DATE CONVERT(DATE,(CONVERT(INT, LF_DATE)) <= GETDATE)...
我希望过去28天的结果在LF_DATE合格
脚本的其余部分正确运行。 我哪里出错了,怎么能纠正它?
答案 0 :(得分:0)
也许这可能会有所帮助
Select DateAdd(DD,-28,cast(cast(20160809 as varchar(8)) as date))
返回2016-07-12
但是,因为你的数据是一个int,我认为将所需的日期范围转换为int而不是执行行级计算会更有效
Declare @DateR1 int = Format(DateAdd(DD,-28,GetDate()),'yyyyMMdd')
Declare @DateR2 int = Format(GetDate(),'yyyyMMdd')
Select DateR1=@DateR1,DateR2=@DateR2
返回
DateR1 DateR2
20160712 20160809
答案 1 :(得分:0)
<强>更新强>
根据您的意见,我已经创建了一些示例数据来测试我的答案:
创建并填充样本数据(请将此步骤保存在您未来的问题中)
DECLARE @T as TABLE
(
Id int,
ActualDate Date,
LF_Date int
)
INSERT INTO @T (Id, ActualDate) VALUES
(10, DATEADD(DAY, -5, GETDATE())),
(9, DATEADD(DAY, -10, GETDATE())),
(8, DATEADD(DAY, -15, GETDATE())),
(7, DATEADD(DAY, -20, GETDATE())),
(6, DATEADD(DAY, -25, GETDATE())),
(5, DATEADD(DAY, -30, GETDATE())),
(4, DATEADD(DAY, -35, GETDATE())),
(3, DATEADD(DAY, -40, GETDATE())),
(2, DATEADD(DAY, -45, GETDATE())),
(1, DATEADD(DAY, -50, GETDATE()))
UPDATE @T
SET LF_Date = YEAR(ActualDate) * 10000 + MONTH(ActualDate) * 100 + DAY(ActualDate)
测试样本数据:
SELECT *
FROM @T
结果:
Id ActualDate LF_Date
----------- ---------- -----------
10 2016-08-09 20160809
9 2016-08-04 20160804
8 2016-07-30 20160730
7 2016-07-25 20160725
6 2016-07-20 20160720
5 2016-07-15 20160715
4 2016-07-10 20160710
3 2016-07-05 20160705
2 2016-06-30 20160630
1 2016-06-25 20160625
正如您所看到的,示例表的LF_Date
列是int
,其日期保持为yyyyMMdd
,就像在问题中一样。
查询:
DECLARE @DateAsInt int,
@Date date = GETDATE();
SELECT @DateAsInt = YEAR(@Date) * 10000 + MONTH(@Date) * 100 + DAY(@Date);
SELECT *
FROM @T
WHERE LF_DATE >= @DateAsInt - 28
AND LF_DATE <= @DateAsInt
结果:
Id ActualDate LF_Date
----------- ---------- -----------
10 2016-08-09 20160809
9 2016-08-04 20160804
就样本数据而言,答案很好。你需要测试你的数据,看看是什么阻止你获得上个月的结果,但我很怀疑这是我的建议。
第一个版本
假设您的Sql server版本是2012或更高版本,您可以使用一些数学和DATEFROMPARTS
内置函数:
DECLARE @IntDate int = 20160322
SELECT DATEFROMPARTS (
(@IntDate - (@IntDate % 10000)) / 10000,
(@IntDate % 1000) / 100,
@IntDate % 100
) As [Date]
结果:
Date
2016-03-22
然而,将date
转换为int
会更简单,可能会有更好的表现:
DECLARE @Date date = '2016-03-22'
SELECT YEAR(@Date) * 10000 +
MONTH(@Date) * 100 +
DAY(@Date) As [Int]
结果:
Int
20160322
要将其置于您的问题的上下文中 - 在查询之前计算当前日期的int值:
DECLARE @DateAsInt int,
@Date date = GETDATE();
SELECT @DateAsInt = YEAR(@Date) * 10000 + MONTH(@Date) * 100 + DAY(@Date);
然后,在你的where子句中,你只需写下:
...
AND LF_DATE >= @DateAsInt - 28
AND LF_DATE <= @DateAsInt
...
在任何情况下,如果您可以更改表结构并使用日期列替换该int列,那么您将会更好。 阅读Aaron Bertrand的Bad habits to kick : choosing the wrong data type.