Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
今天生产-SQL日期计算案例_Sql_Sql Server_Case_Dynamics Ax 2012_Production - Fatal编程技术网

今天生产-SQL日期计算案例

今天生产-SQL日期计算案例,sql,sql-server,case,dynamics-ax-2012,production,Sql,Sql Server,Case,Dynamics Ax 2012,Production,我有一个关于日期计算的问题 我有一个datetime列,名为CreatedLocalTimedate,格式如下:2015-11-15 19:48:50.000 我需要检索一个名为Prod\u Date的新列,其中包含: if “CreatedLocalTime” between (CreatedLocalTime 7 AM) & (CreatedLocalTime+1 7 AM) return CreatedLocalTime date with DD/MM/YYY

我有一个关于日期计算的问题

我有一个datetime列,名为
CreatedLocalTime
date,格式如下:
2015-11-15 19:48:50.000

我需要检索一个名为
Prod\u Date
的新列,其中包含:

if “CreatedLocalTime” between 
    (CreatedLocalTime 7 AM) 
    & (CreatedLocalTime+1 7 AM)
 return CreatedLocalTime date with DD/MM/YYYY format
换句话说,今天的产量=昨天上午7点到今天上午7点的总和


有什么帮助吗

对于
第7天上午
第1天上午7点
,您可以尝试:

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)) 
...
选择强制转换(CreatedLocalTime作为日期)
...
从…起
哪里
CreatedLocalTime>=日期添加(小时,7,强制转换(强制转换(CreatedLocalTime为日期)为日期时间))
及
CreatedLocalTime

对于
前一天上午7点
第7天上午7点
,将7替换为-14,将31替换为7。

看起来您需要类似于

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
第一个版本效率更高,因为查询在开始时只需执行一次日期运算,而第二个版本涉及对每个记录执行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
另一种方式

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部分

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