【问题标题】:Today Production - SQL Date Calculation case whenToday Production - SQL 日期计算案例 when
【发布时间】:2015-12-02 18:03:19
【问题描述】:

我对日期计算有疑问。

我有一个名为 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 点的总和。

使用案例有什么帮助吗?

【问题讨论】:

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


    【解决方案1】:

    day 7AM到day+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 7AM 到 day 7AM,将 7 替换为 -14 并将 31 替换为 7。

    【讨论】:

      【解决方案2】:

      另一种方式..

      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
      

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

      【讨论】:

        【解决方案3】:

        看起来你想要类似的东西

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-13
          • 1970-01-01
          • 2017-05-26
          • 2021-09-23
          • 1970-01-01
          • 2017-06-18
          • 2015-05-08
          相关资源
          最近更新 更多