should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,217 @@
/*
* Legal Notice
*
* This document and associated source code (the "Work") is a part of a
* benchmark specification maintained by the TPC.
*
* The TPC reserves all right, title, and interest to the Work as provided
* under U.S. and international laws, including without limitation all patent
* and trademark rights therein.
*
* No Warranty
*
* 1.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE INFORMATION
* CONTAINED HEREIN IS PROVIDED "AS IS" AND WITH ALL FAULTS, AND THE
* AUTHORS AND DEVELOPERS OF THE WORK HEREBY DISCLAIM ALL OTHER
* WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
* INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) IMPLIED WARRANTIES,
* DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
* PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OF
* WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF NEGLIGENCE.
* ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT,
* QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT
* WITH REGARD TO THE WORK.
* 1.2 IN NO EVENT WILL ANY AUTHOR OR DEVELOPER OF THE WORK BE LIABLE TO
* ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING BUT NOT LIMITED TO THE
* COST OF PROCURING SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS
* OF USE, LOSS OF DATA, OR ANY INCIDENTAL, CONSEQUENTIAL, DIRECT,
* INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER CONTRACT, TORT, WARRANTY,
* OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY OTHER AGREEMENT
* RELATING TO THE WORK, WHETHER OR NOT SUCH AUTHOR OR DEVELOPER HAD
* ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
*
* Contributors
* - Sergey Vasilevskiy
*/
#ifndef DATE_TIME_H
#define DATE_TIME_H
#ifdef WIN32
#include <windows.h>
#endif
#ifdef COMPILE_ODBC_LOAD
// ODBC headers
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
#endif // COMPILE_ODBC_LOAD
#include <sstream>
#include "EGenStandardTypes.h"
namespace TPCE {
// Common datetime structure.
// Identical to ODBC's TIMESTAMP_STRUCT
//
typedef struct tagTIMESTAMP_STRUCT {
INT16 year;
UINT16 month;
UINT16 day;
UINT16 hour;
UINT16 minute;
UINT16 second;
UINT32 fraction;
} TIMESTAMP_STRUCT;
// Date/Time constants
const double NsPerSecondDivisor = 1000000000.0;
const INT32 NsPerSecond = 1000000000;
const double MsPerSecondDivisor = 1000.000;
const INT32 MsPerSecond = 1000;
const INT32 SecondsPerMinute = 60;
const INT32 MinutesPerHour = 60;
const INT32 HoursPerDay = 24;
const INT32 HoursPerWorkDay = 8;
const INT32 DaysPerWorkWeek = 5;
const INT32 DaysPerWeek = 7;
const INT32 SecondsPerHour = SecondsPerMinute * MinutesPerHour;
const INT32 SecondsPerDay = SecondsPerMinute * MinutesPerHour * HoursPerDay;
const INT32 SecondsPerWorkDay = SecondsPerMinute * MinutesPerHour * HoursPerWorkDay;
const INT32 MsPerDay = SecondsPerDay * MsPerSecond;
const INT32 MsPerWorkDay = SecondsPerWorkDay * MsPerSecond;
#define RoundToNearestNsec(d_Seconds) (((INT64)(((d_Seconds)*NsPerSecond) + 0.5)) / NsPerSecondDivisor)
class CDateTime {
private:
INT32 m_dayno; // absolute day number since 1-Jan-0001, starting from zero
INT32 m_msec; // milliseconds from the beginning of the day
char *m_szText; // text representation; only allocated if needed
friend bool operator>(const CDateTime &l_dt, const CDateTime &r_dt);
//
// Ranges used for date/time validation
//
static const INT32 minValidYear = 1;
static const INT32 maxValidYear = 9999;
static const INT32 minValidMonth = 1;
static const INT32 maxValidMonth = 12;
static const INT32 minValidDay = 1;
static const INT32 maxValidDay = 31;
static const INT32 minValidHour = 0;
static const INT32 maxValidHour = 23;
static const INT32 minValidMinute = 0;
static const INT32 maxValidMinute = 59;
static const INT32 minValidSecond = 0;
static const INT32 maxValidSecond = 59;
static const INT32 minValidMilliSecond = 0;
static const INT32 maxValidMilliSecond = 999;
static const INT32 minValidDayNumber = 0;
// days in 1-year period (not including any leap year exceptions) = 365
static const INT32 dy1 = 365;
// days in 4-year period (not including 400 and 100-year exceptions) = 1,461
static const INT32 dy4 = 4 * dy1 + 1; // fourth year is a leap year
// days in 100-year period (not including 400-year exception) = 36,524
static const INT32 dy100 = 25 * dy4 - 1; // 100th year is not a leap year
// days in 400-year period = 146,097
static const INT32 dy400 = 4 * dy100 + 1; // 400th year is a leap year
// month array contains days of months for months in a non leap-year
static const INT32 monthArray[12];
// month array contains days of months for months in a leap-year
static const INT32 monthArrayLY[12];
// MonthArray contains cumulative days for months in a non leap-year
static const INT32 cumulativeMonthArray[];
//
// Utility routine to calculate the day number for a given year/month/day.
//
static INT32 CalculateDayNumber(INT32 year, INT32 month, INT32 day);
//
// Validation routines used to check inputs to constructors and Set methods.
//
static bool IsValid(INT32 year, INT32 month, INT32 day, INT32 hour, INT32 minute, INT32 second, INT32 msec);
static void Validate(INT32 year, INT32 month, INT32 day, INT32 hour, INT32 minute, INT32 second, INT32 msec);
static void Validate(INT32 dayNumber);
static void Validate(INT32 dayNumber, INT32 msecSoFarToday);
//
// Leap Year determinination routine.
//
static bool IsLeapYear(INT32 year);
public:
CDateTime(void); // current local date/time
CDateTime(INT32 dayno); // date as specified; time set to 0:00:00 (midnight)
CDateTime(INT32 year, INT32 month,
INT32 day); // date as specified; time set to 0:00:00 (midnight)
CDateTime(INT32 year, INT32 month, INT32 day, INT32 hour, INT32 minute, INT32 second, INT32 msec);
CDateTime(TIMESTAMP_STRUCT *ts); // date specified in the TIMESTAMP struct
CDateTime(const CDateTime &dt); // proper copy constructor - does not copy m_szText
~CDateTime(void);
void Set(void); // set to current local date/time
void Set(INT32 dayno); // set to specified day number
void Set(INT32 year, INT32 month,
INT32 day); // set to specified date; time set to 0:00:00 (midnight)
void Set(INT32 hour, INT32 minute, INT32 second,
INT32 msec); // set to specified time, date not changed.
void Set(INT32 year, INT32 month, INT32 day, INT32 hour, INT32 minute, INT32 second, INT32 msec);
inline INT32 DayNo(void) {
return m_dayno;
};
inline INT32 MSec(void) {
return m_msec;
};
void GetYMD(INT32 *year, INT32 *month, INT32 *day);
void GetYMDHMS(INT32 *year, INT32 *month, INT32 *day, INT32 *hour, INT32 *minute, INT32 *second, INT32 *msec);
void GetHMS(INT32 *hour, INT32 *minute, INT32 *second, INT32 *msec);
void GetTimeStamp(TIMESTAMP_STRUCT *ts);
#ifdef COMPILE_ODBC_LOAD
void GetDBDATETIME(DBDATETIME *dt);
#endif // COMPILE_ODBC_LOAD
static INT32 YMDtoDayno(INT32 yr, INT32 mm, INT32 dd);
char *ToStr(INT32 style);
void Add(INT32 days, INT32 msec, bool adjust_weekend = false);
void AddMinutes(INT32 Minutes);
void AddWorkMs(INT64 WorkMs);
bool operator<(const CDateTime &);
bool operator<=(const CDateTime &);
// operator > is defined as an external (not in-class) operator in
// CDateTime.cpp
bool operator>=(const CDateTime &);
bool operator==(const CDateTime &);
// compute the difference between two DateTimes;
// result in seconds
double operator-(const CDateTime &dt);
INT32 DiffInMilliSeconds(const CDateTime &BaseTime);
INT32 DiffInMilliSeconds(CDateTime *pBaseTime);
// add another DateTime to this one
CDateTime &operator+=(const CDateTime &dt);
// Proper assignment operator - does not copy szText
CDateTime &operator=(const CDateTime &dt);
};
} // namespace TPCE
#endif // DATE_TIME_H