将INT转换为DATE然后在转换时使用GETDATE?

时间:2016-08-09 22:08:37

标签: sql sql-server date int getdate

我正在尝试将结果从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合格

脚本的其余部分正确运行。 我哪里出错了,怎么能纠正它?

2 个答案:

答案 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.