Examples of how to derive SQL Server dates in AVEVA Historian reports

Tech Note: ISS-TN090
Published Date: March 30, 2009
Primary Product: Historian Server, Historian Clients
Revision Date: March 21, 2022

SUMMARY

This Tech Note provides examples of how to derive different SQL Server dates such as the first day of the month, the first day of the week etc. These examples may become useful while developing Wonderware Historian reports (for instance: “average flow month to date”, “total yield this quarter” etc.).

The examples below will make use of the following Transact-SQL functions:

  • GETDATE() -“ this function returns current SQL Server’s date and time
  • DATEDIFF() -“ this function calculates the amount of time between two dates; it consumes the time interval as a parameter which can be expressed in hours, days, weeks, months, years etc.
  • DATEADD() -“ this function calculates a date by taking an interval of time and adding it to a date, it consumes the time interval defined as provided above

APPLIES TO

  • AVEVA Historian and Historian Client
  • SQL Server Management Studio

PROCEDURE

Section 1 – Day-Based Transact-SQL Examples

Current date

SELECT GETDATE()

Last midnight

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, GETDATE())))

Below is sample screenshot of the command listed above executed within SQL Management Studio 2018.

Note: The last midnight can be returned using the following command:

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

Upcoming midnight

SELECT CONVERT(DATETIME, CONVERT(INT, GETDATE()))

Monday of the current week

SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)

If you don’t want Sunday to be the first day of the week, you need to use a different method. This example sets Monday as the first day of the week.

SET DATEFIRST 1
SELECT
DATEADD(day, 1 DATEPART(weekday, getdate()),
DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0))

If you want to change the example above to calculate a different first day of the week you can adjust the SET DATEFIRST command above to the appropriate value (e.g. “SET DATEFIRST 3” for Wednesday).

Yesterday start

SELECT DATEADD(day, 1, DATEDIFF(day, 0, GETDATE()))

Section 2 – Month-Based Transact-SQL Examples

First day of the current month

SELECT DATEADD(month, DATEDIFF(month,0,GETDATE()), 0)

End of prior month

SELECT DATEADD(ms, 3, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))

Last day of current month

SELECT DATEADD(ms, 3, DATEADD(mm, DATEDIFF(m, 0, GETDATE())+1, 0))

First Monday of the current month

SELECT DATEADD(wk, DATEDIFF(wk, 0, DATEADD(dd, 6
DATEPART(day, GETDATE()), GETDATE())), 0)

Section 3 – Quarter-Based Transact-SQL Examples

First day of the current quarter

SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0)

Last day of the current quarter

SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE())+1, 1)

Section 4 – Year-Based Transact-SQL Examples

First day of the current year

SELECT DATEADD(year, DATEDIFF(year, 0, getdate()), 0)

Last day of the current year

SELECT DATEADD(ms, 3, DATEADD(yy, DATEDIFF(yy, 0, getdate())+1, 0))

Last day of prior prior year

SELECT DATEADD(ms, 3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0))

NOTE: If you need to calculate dates relative to an arbitrary date different from today, you need to change the GETDATE() function call with appropriate reference to the arbitrary date. For example, if you wanted to calculate the Last day of the year from two years ago, you could write GETDATE()-365.

Section 5 – Using These Examples in Historian Client Query

To use these examples in Historian Client Query application, set Query type to “History values” and modify the columns, criteria, retrieval, and other settings to your liking. You do not need to modify the time settings because we will change these in the SQL code. After the settings have been modified, click the SQL tab in the Results pane to see the SQL query that matches your retrieval options.

The code in the screen shot has been placed below for your convenience:

SET NOCOUNT ON
DECLARE
@StartDate DateTime
DECLARE
@EndDate DateTime
SET
@StartDate = DateAdd(mi,-5,GetDate())
SET
@EndDate = GetDate()
SET NOCOUNT OFF
SELECT
TagName, DateTime = convert(nvarchar, DateTime, 21), Value, vValue
FROM History
WHERE TagName IN (‘SysPerfCPUTotal’)
AND
wwRetrievalMode = ‘Delta’
AND wwVersion = ‘Latest’
AND DateTime >= @StartDate
AND DateTime <= @EndDate

If we want to use the previous date examples, we can modify lines 4 and 5 according to what time we want to retrieve.

SET @StartDate = DateAdd(mi,-5,GetDate())
SET
@EndDate = GetDate()

Changing the @StartDate and @EndDate variables yields the same results as changing the time settings in ActiveFactory. For example, if we want to get data ranging from last midnight until now, we would change the lines to:

SET @StartDate = CONVERT(datetime, FLOOR(CONVERT(float, GETDATE())))
SET
@EndDate = GETDATE()

To get all data from last month, we would set the start date to the beginning of last month and the end date to the end of last month:

SET @StartDate = SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()) 1, 0)
SET
@EndDate = SELECT DATEADD(ms, 3, DATEADD(month, DATEDIFF(month, 0,
GETDATE()), 0))


All Industrial Software Solutions Tech Notes are provided "as is" without warranty of any kind.