| Library Name |
Name |
| ColonCancerScreeningFHIR |
Fecal Occult Blood Test Performed |
|
define "Fecal Occult Blood Test Performed":
( ( [Observation: "Fecal Occult Blood Test (FOBT)"] ).isLaboratoryTestPerformed ( ) ) FecalOccultResult
where FecalOccultResult.value is not null
and FecalOccultResult.effective.latest ( ) during day of "Measurement Period"
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Stool DNA with FIT Test Performed |
|
define "Stool DNA with FIT Test Performed":
( ( [Observation: "sDNA FIT Test"] ).isLaboratoryTestPerformed ( ) ) sDNATest
where sDNATest.value is not null
and sDNATest.effective.latest ( ) during day of Interval[start of "Measurement Period" - 2 years, end of "Measurement Period"]
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Flexible Sigmoidoscopy Performed |
|
define "Flexible Sigmoidoscopy Performed":
( ( [Procedure: "Flexible Sigmoidoscopy"] ).isProcedurePerformed ( ) ) FlexibleSigmoidoscopy
where FlexibleSigmoidoscopy.performed.toInterval ( ) ends during day of Interval[start of "Measurement Period" - 4 years, end of "Measurement Period"]
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
CT Colonography Performed |
|
define "CT Colonography Performed":
( ( [Observation: "CT Colonography"] ).isDiagnosticStudyPerformed ( ) ) Colonography
where Colonography.effective.toInterval ( ) ends during day of Interval[start of "Measurement Period" - 4 years, end of "Measurement Period"]
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Colonoscopy Performed |
|
define "Colonoscopy Performed":
( ( [Procedure: "Colonoscopy"] ).isProcedurePerformed ( ) ) Colonoscopy
where Colonoscopy.performed.toInterval ( ) ends during day of Interval[start of "Measurement Period" - 9 years, end of "Measurement Period"]
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Numerator |
|
define "Numerator":
exists "Fecal Occult Blood Test Performed"
or exists "Stool DNA with FIT Test Performed"
or exists "Flexible Sigmoidoscopy Performed"
or exists "CT Colonography Performed"
or exists "Colonoscopy Performed"
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Stratification 2 |
|
define "Stratification 2":
AgeInYearsAt(date from
end of "Measurement Period"
) in Interval[50, 75]
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Stratification 1 |
|
define "Stratification 1":
AgeInYearsAt(date from
end of "Measurement Period"
) in Interval[46, 49]
|
| Library Name |
Name |
| AdultOutpatientEncounters |
Qualifying Encounters |
|
define "Qualifying Encounters":
( ( [Encounter: "Office Visit"]
union [Encounter: "Annual Wellness Visit"]
union [Encounter: "Preventive Care Services Established Office Visit, 18 and Up"]
union [Encounter: "Preventive Care Services Initial Office Visit, 18 and Up"]
union [Encounter: "Home Healthcare Services"]
union [Encounter: "Virtual Encounter"]
union [Encounter: "Telephone Visits"] ).isEncounterPerformed() ) ValidEncounter
where ValidEncounter.period.toInterval() during day of "Measurement Period"
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Initial Population |
|
define "Initial Population":
AgeInYearsAt(date from
end of "Measurement Period"
) in Interval[46, 75]
and exists AdultOutpatientEncounters."Qualifying Encounters"
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Denominator |
|
define "Denominator":
"Initial Population"
|
| Library Name |
Name |
| Hospice |
Has Hospice Services |
|
define "Has Hospice Services":
exists ((([Encounter: "Encounter Inpatient"]).isEncounterPerformed()) InpatientEncounter
where (InpatientEncounter.hospitalization.dischargeDisposition ~ "Discharge to home for hospice care (procedure)"
or InpatientEncounter.hospitalization.dischargeDisposition ~ "Discharge to healthcare facility for hospice care (procedure)"
)
and InpatientEncounter.period.toInterval() ends during day of "Measurement Period"
)
or exists ((([Encounter: "Hospice Encounter"]).isEncounterPerformed()) HospiceEncounter
where HospiceEncounter.period.toInterval() overlaps day of "Measurement Period"
)
or exists ((([Observation: "Hospice care [Minimum Data Set]"]).isAssessmentPerformed()) HospiceAssessment
where HospiceAssessment.value ~ "Yes (qualifier value)"
and HospiceAssessment.effective.toInterval() overlaps day of "Measurement Period"
)
or exists ((([ServiceRequest: "Hospice Care Ambulatory"]).isInterventionOrder()) HospiceOrder
where HospiceOrder.authoredOn.toInterval() during day of "Measurement Period"
// and HospiceOrder.doNotPerform is not true
// https://oncprojectracking.healthit.gov/support/browse/CQLIT-447
)
or exists ((([Procedure: "Hospice Care Ambulatory"]).isInterventionPerformed()) HospicePerformed
where HospicePerformed.performed.toInterval() overlaps day of "Measurement Period"
)
or exists (([Condition: "Hospice Diagnosis"]) HospiceCareDiagnosis
where HospiceCareDiagnosis.prevalenceInterval() overlaps day of "Measurement Period"
)
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Malignant Neoplasm |
|
define "Malignant Neoplasm":
( [Condition: "Malignant Neoplasm of Colon"] ) ColorectalCancer
where ColorectalCancer.prevalenceInterval ( ) starts on or before day of end of "Measurement Period"
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Total Colectomy Performed |
|
define "Total Colectomy Performed":
( ( [Procedure: "Total Colectomy"] ).isProcedurePerformed ( ) ) Colectomy
where Colectomy.performed.toInterval ( ) ends on or before day of end of "Measurement Period"
|
| Library Name |
Name |
| AdvancedIllnessandFrailty |
Has Criteria Indicating Frailty |
|
define "Has Criteria Indicating Frailty":
exists ( (([DeviceRequest: "Frailty Device"]).isDeviceOrder()) FrailtyDeviceOrder
where FrailtyDeviceOrder.doNotPerform() is not true
and FrailtyDeviceOrder.authoredOn.toInterval() during day of "Measurement Period"
)
or exists ( (([Observation: "Medical equipment used"]).isAssessmentPerformed()) EquipmentUsed
where EquipmentUsed.value as Concept in "Frailty Device"
and EquipmentUsed.effective.toInterval() ends during day of "Measurement Period"
)
or exists ( ([Condition: "Frailty Diagnosis"]) FrailtyDiagnosis
where FrailtyDiagnosis.prevalenceInterval() overlaps day of "Measurement Period"
)
or exists ( (([Encounter: "Frailty Encounter"]).isEncounterPerformed()) FrailtyEncounter
where FrailtyEncounter.period.toInterval() overlaps day of "Measurement Period"
)
or exists ( (([Observation: "Frailty Symptom"]).isSymptom()) FrailtySymptom
where FrailtySymptom.effective.toInterval() overlaps day of "Measurement Period"
)
|
| Library Name |
Name |
| AdvancedIllnessandFrailty |
Has Advanced Illness in Year Before or During Measurement Period |
|
define "Has Advanced Illness in Year Before or During Measurement Period":
exists ([Condition: "Advanced Illness"] AdvancedIllnessDiagnosis
where AdvancedIllnessDiagnosis.prevalenceInterval() starts during day of Interval[start of "Measurement Period" - 1 year, end of "Measurement Period"])
|
| Library Name |
Name |
| AdvancedIllnessandFrailty |
Has Dementia Medications in Year Before or During Measurement Period |
|
define "Has Dementia Medications in Year Before or During Measurement Period":
exists (( ([MedicationRequest: medication in "Dementia Medications"]).isMedicationActive()) DementiaMedication
// https://oncprojectracking.healthit.gov/support/browse/CQLIT-449
where DementiaMedication.medicationRequestPeriod() overlaps day of Interval[start of "Measurement Period" - 1 year,
end of "Measurement Period"]
// and DementiaMedication.doNotPerform is not true
// https://oncprojectracking.healthit.gov/support/browse/CQLIT-447
)
|
| Library Name |
Name |
| AdvancedIllnessandFrailty |
Is Age 66 or Older with Advanced Illness and Frailty |
|
define "Is Age 66 or Older with Advanced Illness and Frailty":
AgeInYearsAt(date from end of "Measurement Period")>= 66
and "Has Criteria Indicating Frailty"
and ( "Has Advanced Illness in Year Before or During Measurement Period"
or "Has Dementia Medications in Year Before or During Measurement Period"
)
|
| Library Name |
Name |
| AdvancedIllnessandFrailty |
Is Age 66 or Older Living Long Term in a Nursing Home |
|
define "Is Age 66 or Older Living Long Term in a Nursing Home":
AgeInYearsAt(date from
end of "Measurement Period"
)>= 66
and ( ( Last( (([Observation: "Housing status"]).isAssessmentPerformed()) HousingStatus
where HousingStatus.effective.toInterval() ends on or before
day of end of "Measurement Period"
sort by
end of effective.toInterval() asc
)) LastHousingStatus
where LastHousingStatus.value ~ "Lives in a nursing home (finding)"
) is not null
|
| Library Name |
Name |
| PalliativeCare |
Has Palliative Care in the Measurement Period |
|
define "Has Palliative Care in the Measurement Period":
exists ((([Observation: "Functional Assessment of Chronic Illness Therapy - Palliative Care Questionnaire (FACIT-Pal)"]).isAssessmentPerformed()) PalliativeAssessment
where PalliativeAssessment.effective.toInterval() overlaps day of "Measurement Period"
)
or exists ([Condition: "Palliative Care Diagnosis"] PalliativeDiagnosis
where PalliativeDiagnosis.prevalenceInterval() overlaps day of "Measurement Period"
)
or exists ((([Encounter: "Palliative Care Encounter"]).isEncounterPerformed()) PalliativeEncounter
where PalliativeEncounter.period.toInterval() overlaps day of "Measurement Period"
)
or exists ((([Procedure: "Palliative Care Intervention"]).isInterventionPerformed()) PalliativeIntervention
where PalliativeIntervention.performed.toInterval() overlaps day of "Measurement Period"
)
|
| Library Name |
Name |
| ColonCancerScreeningFHIR |
Denominator Exclusion |
|
define "Denominator Exclusion":
Hospice."Has Hospice Services"
or exists "Malignant Neoplasm"
or exists "Total Colectomy Performed"
or AIFrailLTCF."Is Age 66 or Older with Advanced Illness and Frailty"
or AIFrailLTCF."Is Age 66 or Older Living Long Term in a Nursing Home"
or PalliativeCare."Has Palliative Care in the Measurement Period"
|
| Library Name |
Name |
| Status |
isLaboratoryTestPerformed |
|
//Laboratory Test, Performed
define fluent function isLaboratoryTestPerformed(Obs List<Observation>):
Obs O
where O.status in { 'final', 'amended', 'corrected' }
and exists ( O.category ObservationCategory
where ( ObservationCategory ) ~ "laboratory"
)
|
| Library Name |
Name |
| FHIRHelpers |
ToConcept |
|
/*
@description: Converts the given FHIR [CodeableConcept](https://hl7.org/fhir/datatypes.html#CodeableConcept) value to a CQL Concept.
*/
define function ToConcept(concept FHIR.CodeableConcept):
if concept is null then
null
else
System.Concept {
codes: concept.coding C return ToCode(C),
display: concept.text.value
}
|
| Library Name |
Name |
| FHIRHelpers |
ToCode |
|
/*
@description: Converts the given FHIR [Coding](https://hl7.org/fhir/datatypes.html#Coding) value to a CQL Code.
*/
define function ToCode(coding FHIR.Coding):
if coding is null then
null
else
System.Code {
code: coding.code.value,
system: coding.system.value,
version: coding.version.value,
display: coding.display.value
}
|
| Library Name |
Name |
| QICoreCommon |
latest |
|
/*
@description: Given an interval, returns the ending point if the interval has an ending boundary specified,
otherwise, returns the starting point
*/
define fluent function latest(choice Choice<DateTime, Quantity, Interval<DateTime>, Interval<Quantity>> ):
(choice.toInterval()) period
return
if (period."hasEnd"()) then end of period
else start of period
|
| Library Name |
Name |
| QICoreCommon |
hasEnd |
|
/*
@description: Given an interval, returns true if the interval has an ending boundary specified
(i.e. the end of the interval is not null and not the maximum DateTime value)
*/
define fluent function hasEnd(period Interval<DateTime> ):
not (
end of period is null
or end of period = maximum DateTime
)
|
| Library Name |
Name |
| Status |
isProcedurePerformed |
|
//Procedure, Performed
define fluent function isProcedurePerformed(Proc List<Procedure>):
Proc P
where P.status ~ 'completed'
|
| Library Name |
Name |
| Status |
isDiagnosticStudyPerformed |
|
//Diagnostic Study, Performed
define fluent function isDiagnosticStudyPerformed(Obs List<Observation>):
Obs O
where O.status in {'final', 'amended', 'corrected' }
|
| Library Name |
Name |
| Status |
isEncounterPerformed |
|
//Encounter, Performed
//General usage unless required otherwise by measure intent (e.g., follow-up encounters)
define fluent function isEncounterPerformed(Enc List<Encounter>):
Enc E
where E.status in {'finished', 'arrived', 'triaged', 'in-progress', 'onleave'}
|
| Library Name |
Name |
| QICoreCommon |
toInterval |
|
/*
@description: Normalizes a value that is a choice of timing-valued types to an equivalent interval
@comment: Normalizes a choice type of DateTime, Quanitty, Interval<DateTime>, or Interval<Quantity> types
to an equivalent interval. This selection of choice types is a superset of the majority of choice types that are used as possible
representations for timing-valued elements in QICore, allowing this function to be used across any resource.
The input can be provided as a DateTime, Quantity, Interval<DateTime> or Interval<Quantity>.
The intent of this function is to provide a clear and concise mechanism to treat single
elements that have multiple possible representations as intervals so that logic doesn't have to account
for the variability. More complex calculations (such as medication request period or dispense period
calculation) need specific guidance and consideration. That guidance may make use of this function, but
the focus of this function is on single element calculations where the semantics are unambiguous.
If the input is a DateTime, the result a DateTime Interval beginning and ending on that DateTime.
If the input is a Quantity, the quantity is expected to be a calendar-duration interpreted as an Age,
and the result is a DateTime Interval beginning on the Date the patient turned that age and ending immediately before one year later.
If the input is a DateTime Interval, the result is the input.
If the input is a Quantity Interval, the quantities are expected to be calendar-durations interpreted as an Age, and the result
is a DateTime Interval beginning on the date the patient turned the age given as the start of the quantity interval, and ending
immediately before one year later than the date the patient turned the age given as the end of the quantity interval.
If the input is a Timing, an error will be thrown indicating that Timing calculations are not implemented. Any other input will reslt in a null DateTime Interval
*/
define fluent function toInterval(choice Choice<DateTime, Quantity, Interval<DateTime>, Interval<Quantity>, Timing>):
case
when choice is DateTime then
Interval[choice as DateTime, choice as DateTime]
when choice is Interval<DateTime> then
choice as Interval<DateTime>
when choice is Quantity then
Interval[Patient.birthDate + (choice as Quantity),
Patient.birthDate + (choice as Quantity) + 1 year)
when choice is Interval<Quantity> then
Interval[Patient.birthDate + (choice.low as Quantity),
Patient.birthDate + (choice.high as Quantity) + 1 year)
when choice is Timing then
Message(null, true, 'NOT_IMPLEMENTED', 'Error', 'Calculation of an interval from a Timing value is not supported') as Interval<DateTime>
else
null as Interval<DateTime>
end
|
| Library Name |
Name |
| FHIRHelpers |
ToInterval |
|
/*
@description: Converts the given [Period](https://hl7.org/fhir/datatypes.html#Period)
value to a CQL DateTime Interval
@comment: If the start value of the given period is unspecified, the starting
boundary of the resulting interval will be open (meaning the start of the interval
is unknown, as opposed to interpreted as the beginning of time).
*/
define function ToInterval(period FHIR.Period):
if period is null then
null
else
if period."start" is null then
Interval(period."start".value, period."end".value]
else
Interval[period."start".value, period."end".value]
|
| Library Name |
Name |
| Status |
isAssessmentPerformed |
|
//This library contains functions that are based on QDM 5.6 to QICore 4.1.1 March 2023 (https://github.com/cqframework/CQL-Formatting-and-Usage-Wiki/wiki/Authoring-Patterns---QICore-v4.1.1). The functions may appear similar to some QICoreCommon functions but different in that they have constraints that are relevant for measures authored by NCQA.
//Assessment, Performed
define fluent function isAssessmentPerformed(Obs List<Observation>):
Obs O
where O.status in { 'final', 'amended', 'corrected' }
and exists ( O.category ObservationCategory
where ( ObservationCategory ) ~ "survey"
)
|
| Library Name |
Name |
| Status |
isInterventionOrder |
|
//Intervention, Order: active and completed only
define fluent function isInterventionOrder(ServiceRequest List<ServiceRequest>):
ServiceRequest S
where S.status in { 'active', 'completed' }
and S.intent = 'order'
|
| Library Name |
Name |
| Status |
isInterventionPerformed |
|
//Intervention, Performed
define fluent function isInterventionPerformed(Proc List<Procedure>):
Proc P
where P.status ~ 'completed'
|
| Library Name |
Name |
| QICoreCommon |
prevalenceInterval |
|
/*
@description: Returns an interval representing the normalized prevalence period of a given Condition.
@comment: Uses the ToInterval and ToAbatementInterval functions to determine the widest potential interval from
onset to abatement as specified in the given Condition. If the condition is active, or has an abatement date the resulting
interval will have a closed ending boundary. Otherwise, the resulting interval will have an open ending boundary.
*/
define fluent function prevalenceInterval(condition Condition):
if condition.clinicalStatus ~ "active"
or condition.clinicalStatus ~ "recurrence"
or condition.clinicalStatus ~ "relapse" then
Interval[start of condition.onset.toInterval(), end of condition.abatementInterval()]
else
(end of condition.abatementInterval()) abatementDate
return if abatementDate is null then
Interval[start of condition.onset.toInterval(), abatementDate)
else
Interval[start of condition.onset.toInterval(), abatementDate]
|
| Library Name |
Name |
| QICoreCommon |
abatementInterval |
|
/*
@description: Returns an interval representing the normalized abatement of a given Condition.
@comment: If the abatement element of the Condition is represented as a DateTime, the result
is an interval beginning and ending on that DateTime.
If the abatement is represented as a Quantity, the quantity is expected to be a calendar-duration and is interpreted as the age of the patient. The
result is an interval from the date the patient turned that age to immediately before one year later.
If the abatement is represented as a Quantity Interval, the quantities are expected to be calendar-durations and are interpreted as an age range during
which the abatement occurred. The result is an interval from the date the patient turned the starting age of the quantity interval, and ending immediately
before one year later than the date the patient turned the ending age of the quantity interval.
*/
define fluent function abatementInterval(condition Condition):
if condition.abatement is DateTime then
Interval[condition.abatement as DateTime, condition.abatement as DateTime]
else if condition.abatement is Quantity then
Interval[Patient.birthDate + (condition.abatement as Quantity),
Patient.birthDate + (condition.abatement as Quantity) + 1 year)
else if condition.abatement is Interval<Quantity> then
Interval[Patient.birthDate + (condition.abatement.low as Quantity),
Patient.birthDate + (condition.abatement.high as Quantity) + 1 year)
else if condition.abatement is Interval<DateTime> then
Interval[condition.abatement.low, condition.abatement.high)
else null as Interval<DateTime>
|
| Library Name |
Name |
| Status |
isDeviceOrder |
|
//Device, Order - Personal Use Devices: active and completed only
define fluent function isDeviceOrder(DeviceRequest List<DeviceRequest>):
DeviceRequest D
where D.status in { 'active', 'completed' }
and D.intent = 'order'
|
| Library Name |
Name |
| QICoreCommon |
doNotPerform |
|
/*
@description: Returns true if the given DeviceRequest is a negation (i.e. do not perform this order)
*/
define fluent function doNotPerform(deviceRequest DeviceRequest):
singleton from (
deviceRequest.modifierExtension E
where E.url = 'http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-doNotPerform'
return E.value as Boolean
)
|
| Library Name |
Name |
| Status |
isSymptom |
|
//Symptom
define fluent function isSymptom(Obs List<Observation>):
Obs O
where O.status in { 'preliminary', 'final', 'amended', 'corrected' }
|
| Library Name |
Name |
| Status |
isMedicationActive |
|
//Medication, Active
define fluent function isMedicationActive(MedicationRequest List<MedicationRequest>):
MedicationRequest M
where M.status = 'active'
and M.intent = 'order'
|
| Library Name |
Name |
| CumulativeMedicationDuration |
medicationRequestPeriod |
|
define fluent function medicationRequestPeriod(Request "MedicationRequest"):
Request R
let
dosage: singleton from R.dosageInstruction,
doseAndRate: singleton from dosage.doseAndRate,
timing: dosage.timing,
frequency: Coalesce(timing.repeat.frequencyMax, timing.repeat.frequency),
period: Quantity(timing.repeat.period, timing.repeat.periodUnit),
doseRange: doseAndRate.dose,
doseQuantity: doseAndRate.dose,
dose: Coalesce(end of doseRange, doseQuantity),
dosesPerDay: Coalesce(ToDaily(frequency, period), Count(timing.repeat.timeOfDay), 1.0),
boundsPeriod: timing.repeat.bounds as Interval<DateTime>,
daysSupply: (convert R.dispenseRequest.expectedSupplyDuration to days).value,
quantity: R.dispenseRequest.quantity,
refills: Coalesce(R.dispenseRequest.numberOfRepeatsAllowed, 0),
startDate:
Coalesce(
date from start of boundsPeriod,
date from R.authoredOn,
date from start of R.dispenseRequest.validityPeriod
),
totalDaysSupplied: Coalesce(daysSupply, quantity.value / (dose.value * dosesPerDay)) * (1 + refills)
return
if startDate is not null and totalDaysSupplied is not null then
Interval[startDate, startDate + Quantity(totalDaysSupplied - 1, 'day') ]
else if startDate is not null and boundsPeriod."high" is not null then
Interval[startDate, date from end of boundsPeriod]
else
null
|
| Library Name |
Name |
| CumulativeMedicationDuration |
Quantity |
|
/**********************************************************************/
/* Functions in this region are copied from opioid-mme-r4 */
/**********************************************************************/
define function Quantity(value Decimal, unit String):
if value is not null then
System.Quantity { value: value, unit: unit }
else
null
|
| Library Name |
Name |
| CumulativeMedicationDuration |
ToDaily |
|
/*
Goal is to get to number of days
Two broad approaches to the calculation:
1) Based on supply and frequency, calculate the number of expected days the medication will cover/has covered
2) Based on relevant period, determine a covered interval and calculate the length of that interval in days
This topic covers several use cases and illustrates how to calculate Cumulative
Medication Duration for each type of medication resource using the supply and
frequency approach.
*/
/*
For the first approach, we need to get from frequency to a frequency/day
So we define ToDaily
*/
/*
Calculates daily frequency given frequency within a period
*/
define function ToDaily(frequency System.Integer, period System.Quantity):
case period.unit
when 'h' then frequency * (24.0 / period.value)
when 'min' then frequency * (24.0 / period.value) * 60
when 's' then frequency * (24.0 / period.value) * 60 * 60
when 'd' then frequency * (24.0 / period.value) / 24
when 'wk' then frequency * (24.0 / period.value) / (24 * 7)
when 'mo' then frequency * (24.0 / period.value) / (24 * 30) /* assuming 30 days in month */
when 'a' then frequency * (24.0 / period.value) / (24 * 365) /* assuming 365 days in year */
when 'hour' then frequency * (24.0 / period.value)
when 'minute' then frequency * (24.0 / period.value) * 60
when 'second' then frequency * (24.0 / period.value) * 60 * 60
when 'day' then frequency * (24.0 / period.value) / 24
when 'week' then frequency * (24.0 / period.value) / (24 * 7)
when 'month' then frequency * (24.0 / period.value) / (24 * 30) /* assuming 30 days in month */
when 'year' then frequency * (24.0 / period.value) / (24 * 365) /* assuming 365 days in year */
when 'hours' then frequency * (24.0 / period.value)
when 'minutes' then frequency * (24.0 / period.value) * 60
when 'seconds' then frequency * (24.0 / period.value) * 60 * 60
when 'days' then frequency * (24.0 / period.value) / 24
when 'weeks' then frequency * (24.0 / period.value) / (24 * 7)
when 'months' then frequency * (24.0 / period.value) / (24 * 30) /* assuming 30 days in month */
when 'years' then frequency * (24.0 / period.value) / (24 * 365) /* assuming 365 days in year */
else Message(null, true, 'CMDLogic.ToDaily.UnknownUnit', ErrorLevel, 'Unknown unit ' & period.unit)
end
|