aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/timestamp.c
blob: df43b418ab9ed58cc733f7800fa5c78045c9f379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "postgres.h"
#include "utils/builtins.h"

int4
timestamp_in(char *timestamp_str)
{
    struct tm input_time;
    int4 result;

    memset(&input_time, 0, sizeof(input_time));
    if(sscanf(timestamp_str, "%d%*c%d%*c%d%*c%d%*c%d%*c%d",
	      &input_time.tm_year, &input_time.tm_mon, &input_time.tm_mday,
	      &input_time.tm_hour, &input_time.tm_min, &input_time.tm_sec) != 6) {
	elog(WARN, "timestamp_in: timestamp \"%s\" not of the form yyyy-mm-dd hh:mm:ss",
	     timestamp_str);
    }

    /* range checking?  bahahahaha.... */

    input_time.tm_year -= 1900;
    input_time.tm_mon -= 1;

    /* use mktime(), but make this GMT, not local time */
    result = mktime(&input_time);
    result -= timezone;

    return result;
}

char *
timestamp_out(int4 timestamp)
{
    char *result;
    struct tm *time;

    time = gmtime((time_t *)&timestamp);
    result = palloc(20);
    sprintf(result, "%04d-%02d-%02d %02d:%02d:%02d",
	    time->tm_year+1900, time->tm_mon+1, time->tm_mday,
	    time->tm_hour, time->tm_min, time->tm_sec);

    return result;
}

int4
now(void)
{
    struct tm ignore;
    time_t sec;

    /* we want the local time here.  but 'timezone' doesn't get set */
    /* until we do a mktime().  so do one.                          */
    memset(&ignore, 0, sizeof(ignore));
    mktime(&ignore);

    time(&sec);
    sec -= timezone;
    return((int4)sec);
}

int4
timestampeq(int4 t1, int4 t2)
{
    return t1 == t2;
}

int4
timestampne(int4 t1, int4 t2)
{
    return t1 != t2;
}

int4
timestamplt(int4 t1, int4 t2)
{
    return t1 < t2;
}

int4
timestampgt(int4 t1, int4 t2)
{
    return t1 > t2;
}

int4
timestample(int4 t1, int4 t2)
{
    return t1 <= t2;
}

int4
timestampge(int4 t1, int4 t2)
{
    return t1 >= t2;
}