今天生产 - SQL日期计算的情况

时间:2015-12-02 09:04:34

标签: sql sql-server case dynamics-ax-2012 production

我有关于日期计算的问题。

我有一个名为CreatedLocalTime日期的日期时间列,格式为: 2015-11-15 19:48:50.000

我需要使用以下内容检索名为Prod_Date的新列

if “CreatedLocalTime” between 
    (CreatedLocalTime 7 AM) 
    & (CreatedLocalTime+1 7 AM)
 return CreatedLocalTime date with DD/MM/YYYY format

换言之,今天的产量=昨天上午7点至今天上午7点的总和。

使用案例的任何帮助?

3 个答案:

答案 0 :(得分:0)

对于day 7AMday+1 7AM,您可以尝试:

SELECT CAST(CreatedLocalTime as date) 
...
FROM ...
WHERE ...
    CreatedLocalTime >= DATEADD(hour, 7, CAST(CAST(CreatedLocalTime as date) as datetime)) 
AND 
    CreatedLocalTime  < DATEADD(hour, 31, CAST(CAST(CreatedLocalTime as date) as datetime)) 
...

对于previous day 7AMday 7AM,将7替换为-14,将31替换为7。

答案 1 :(得分:0)

看起来你想要的东西是

DECLARE @StartDateTime Datetime 
DECLARE @EndDateTime Datetime 
SET @EndDateTime  = DATEADD(hour, 7,convert(datetime,convert(date,getdate())) )
SET @StartDateTime  = DATEADD(day, -1, @EndDateTime  )

--Print out the variables for demonstration purposes
PRINT '@StartDateTime = '+CONVERT(nchar(19), @StartDateTime,120)
PRINT '@EndDateTime   = '+CONVERT(nchar(19), @EndDateTime,120)

SELECT SUM (Production) AS Prod_Date FROM YourSchema.YourTable WHERE CreatedLocalTime >= @StartDateTime AND CreatedLocalTime < @EndDateTime

但你也可以看一下,因为你从他们那里删除了7个小时之后的所有时间都是昨天

SELECT SUM (Production) AS Prod_Date 
FROM YourSchema.YourTable 
WHERE DATEDIFF(day,DATEADD(hour, -7, CreatedLocalTime ))) = 1

第一个版本将更有效,因为查询只需要在开始时执行一次日期算术,而第二个版本则涉及为每个记录执行DATEDIFF和DATEADD。对于大量数据,这将会变慢。

镀金解决方案是在表格中添加计算列

ALTER TABLE YourSchema.YourTable ADD EffectiveDate AS CONVERT(date, DATEDIFF(day,DATEADD(hour, -7, CreatedLocalTime ))))

然后是该列的索引

CREATE INDEX IX_YourTable_EffectiveDate  ON YourSchema.YourTable (EffectiveDate )

所以你可以写

DECLARE @YesterDay date = DATEADD(day,-1, getdate())
SELECT SUM (Production) AS Prod_Date 
FROM YourSchema.YourTable 
WHERE EffectiveDate = @YesterDay

答案 2 :(得分:0)

另一种方式..

SELECT  CASE WHEN CreatedLocalTime BETWEEN DATEADD(HOUR, 7,
                                                            CAST(CAST (CreatedLocalTime AS DATE) AS DATETIME))
                                            AND     DATEADD(HOUR, 31,
                                                            CAST(CAST (CreatedLocalTime AS DATE) AS DATETIME))
             THEN REPLACE(CONVERT(NVARCHAR, CreatedLocalTime, 103), ' ', '/')
        END AS CreatedLocalTime

如果需要,您可以为此编写其他部分