1 /* 2 ** 2003 October 31 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 ** This file contains the C functions that implement date and time 13 ** functions for SQLite. 14 ** 15 ** There is only one exported symbol in this file - the function 16 ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. 17 ** All other code has file scope. 18 ** 19 ** $Id: date.c,v 1.64 2007/05/04 13:15:56 drh Exp $ 20 ** 21 ** NOTES: 22 ** 23 ** SQLite processes all times and dates as Julian Day numbers. The 24 ** dates and times are stored as the number of days since noon 25 ** in Greenwich on November 24, 4714 B.C. according to the Gregorian 26 ** calendar system. 27 ** 28 ** 1970-01-01 00:00:00 is JD 2440587.5 29 ** 2000-01-01 00:00:00 is JD 2451544.5 30 ** 31 ** This implemention requires years to be expressed as a 4-digit number 32 ** which means that only dates between 0000-01-01 and 9999-12-31 can 33 ** be represented, even though julian day numbers allow a much wider 34 ** range of dates. 35 ** 36 ** The Gregorian calendar system is used for all dates and times, 37 ** even those that predate the Gregorian calendar. Historians usually 38 ** use the Julian calendar for dates prior to 1582-10-15 and for some 39 ** dates afterwards, depending on locale. Beware of this difference. 40 ** 41 ** The conversion algorithms are implemented based on descriptions 42 ** in the following text: 43 ** 44 ** Jean Meeus 45 ** Astronomical Algorithms, 2nd Edition, 1998 46 ** ISBM 0-943396-61-1 47 ** Willmann-Bell, Inc 48 ** Richmond, Virginia (USA) 49 */ 50 #include "sqliteInt.h" 51 #include "os.h" 52 #include <ctype.h> 53 #include <stdlib.h> 54 #include <assert.h> 55 #include <time.h> 56 57 #ifndef SQLITE_OMIT_DATETIME_FUNCS 58 59 /* 60 ** A structure for holding a single date and time. 61 */ 62 typedef struct DateTime DateTime; 63 struct DateTime { 64 double rJD; /* The julian day number */ 65 int Y, M, D; /* Year, month, and day */ 66 int h, m; /* Hour and minutes */ 67 int tz; /* Timezone offset in minutes */ 68 double s; /* Seconds */ 69 char validYMD; /* True if Y,M,D are valid */ 70 char validHMS; /* True if h,m,s are valid */ 71 char validJD; /* True if rJD is valid */ 72 char validTZ; /* True if tz is valid */ 73 }; 74 75 76 /* 77 ** Convert zDate into one or more integers. Additional arguments 78 ** come in groups of 5 as follows: 79 ** 80 ** N number of digits in the integer 81 ** min minimum allowed value of the integer 82 ** max maximum allowed value of the integer 83 ** nextC first character after the integer 84 ** pVal where to write the integers value. 85 ** 86 ** Conversions continue until one with nextC==0 is encountered. 87 ** The function returns the number of successful conversions. 88 */ 89 static int getDigits(const char *zDate, ...){ 90 va_list ap; 91 int val; 92 int N; 93 int min; 94 int max; 95 int nextC; 96 int *pVal; 97 int cnt = 0; 98 va_start(ap, zDate); 99 do{ 100 N = va_arg(ap, int); 101 min = va_arg(ap, int); 102 max = va_arg(ap, int); 103 nextC = va_arg(ap, int); 104 pVal = va_arg(ap, int*); 105 val = 0; 106 while( N-- ){ 107 if( !isdigit(*(u8*)zDate) ){ 108 goto end_getDigits; 109 } 110 val = val*10 + *zDate - '0'; 111 zDate++; 112 } 113 if( val<min || val>max || (nextC!=0 && nextC!=*zDate) ){ 114 goto end_getDigits; 115 } 116 *pVal = val; 117 zDate++; 118 cnt++; 119 }while( nextC ); 120 end_getDigits: 121 va_end(ap); 122 return cnt; 123 } 124 125 /* 126 ** Read text from z[] and convert into a floating point number. Return 127 ** the number of digits converted. 128 */ 129 #define getValue sqlite3AtoF 130 131 /* 132 ** Parse a timezone extension on the end of a date-time. 133 ** The extension is of the form: 134 ** 135 ** (+/-)HH:MM 136 ** 137 ** If the parse is successful, write the number of minutes 138 ** of change in *pnMin and return 0. If a parser error occurs, 139 ** return 0. 140 ** 141 ** A missing specifier is not considered an error. 142 */ 143 static int parseTimezone(const char *zDate, DateTime *p){ 144 int sgn = 0; 145 int nHr, nMn; 146 while( isspace(*(u8*)zDate) ){ zDate++; } 147 p->tz = 0; 148 if( *zDate=='-' ){ 149 sgn = -1; 150 }else if( *zDate=='+' ){ 151 sgn = +1; 152 }else{ 153 return *zDate!=0; 154 } 155 zDate++; 156 if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){ 157 return 1; 158 } 159 zDate += 5; 160 p->tz = sgn*(nMn + nHr*60); 161 while( isspace(*(u8*)zDate) ){ zDate++; } 162 return *zDate!=0; 163 } 164 165 /* 166 ** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF. 167 ** The HH, MM, and SS must each be exactly 2 digits. The 168 ** fractional seconds FFFF can be one or more digits. 169 ** 170 ** Return 1 if there is a parsing error and 0 on success. 171 */ 172 static int parseHhMmSs(const char *zDate, DateTime *p){ 173 int h, m, s; 174 double ms = 0.0; 175 if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){ 176 return 1; 177 } 178 zDate += 5; 179 if( *zDate==':' ){ 180 zDate++; 181 if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){ 182 return 1; 183 } 184 zDate += 2; 185 if( *zDate=='.' && isdigit((u8)zDate[1]) ){ 186 double rScale = 1.0; 187 zDate++; 188 while( isdigit(*(u8*)zDate) ){ 189 ms = ms*10.0 + *zDate - '0'; 190 rScale *= 10.0; 191 zDate++; 192 } 193 ms /= rScale; 194 } 195 }else{ 196 s = 0; 197 } 198 p->validJD = 0; 199 p->validHMS = 1; 200 p->h = h; 201 p->m = m; 202 p->s = s + ms; 203 if( parseTimezone(zDate, p) ) return 1; 204 p->validTZ = p->tz!=0; 205 return 0; 206 } 207 208 /* 209 ** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume 210 ** that the YYYY-MM-DD is according to the Gregorian calendar. 211 ** 212 ** Reference: Meeus page 61 213 */ 214 static void computeJD(DateTime *p){ 215 int Y, M, D, A, B, X1, X2; 216 217 if( p->validJD ) return; 218 if( p->validYMD ){ 219 Y = p->Y; 220 M = p->M; 221 D = p->D; 222 }else{ 223 Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ 224 M = 1; 225 D = 1; 226 } 227 if( M<=2 ){ 228 Y--; 229 M += 12; 230 } 231 A = Y/100; 232 B = 2 - A + (A/4); 233 X1 = 365.25*(Y+4716); 234 X2 = 30.6001*(M+1); 235 p->rJD = X1 + X2 + D + B - 1524.5; 236 p->validJD = 1; 237 if( p->validHMS ){ 238 p->rJD += (p->h*3600.0 + p->m*60.0 + p->s)/86400.0; 239 if( p->validTZ ){ 240 p->rJD -= p->tz*60/86400.0; 241 p->validYMD = 0; 242 p->validHMS = 0; 243 p->validTZ = 0; 244 } 245 } 246 } 247 248 /* 249 ** Parse dates of the form 250 ** 251 ** YYYY-MM-DD HH:MM:SS.FFF 252 ** YYYY-MM-DD HH:MM:SS 253 ** YYYY-MM-DD HH:MM 254 ** YYYY-MM-DD 255 ** 256 ** Write the result into the DateTime structure and return 0 257 ** on success and 1 if the input string is not a well-formed 258 ** date. 259 */ 260 static int parseYyyyMmDd(const char *zDate, DateTime *p){ 261 int Y, M, D, neg; 262 263 if( zDate[0]=='-' ){ 264 zDate++; 265 neg = 1; 266 }else{ 267 neg = 0; 268 } 269 if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){ 270 return 1; 271 } 272 zDate += 10; 273 while( isspace(*(u8*)zDate) || 'T'==*(u8*)zDate ){ zDate++; } 274 if( parseHhMmSs(zDate, p)==0 ){ 275 /* We got the time */ 276 }else if( *zDate==0 ){ 277 p->validHMS = 0; 278 }else{ 279 return 1; 280 } 281 p->validJD = 0; 282 p->validYMD = 1; 283 p->Y = neg ? -Y : Y; 284 p->M = M; 285 p->D = D; 286 if( p->validTZ ){ 287 computeJD(p); 288 } 289 return 0; 290 } 291 292 /* 293 ** Attempt to parse the given string into a Julian Day Number. Return 294 ** the number of errors. 295 ** 296 ** The following are acceptable forms for the input string: 297 ** 298 ** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM 299 ** DDDD.DD 300 ** now 301 ** 302 ** In the first form, the +/-HH:MM is always optional. The fractional 303 ** seconds extension (the ".FFF") is optional. The seconds portion 304 ** (":SS.FFF") is option. The year and date can be omitted as long 305 ** as there is a time string. The time string can be omitted as long 306 ** as there is a year and date. 307 */ 308 static int parseDateOrTime(const char *zDate, DateTime *p){ 309 memset(p, 0, sizeof(*p)); 310 if( parseYyyyMmDd(zDate,p)==0 ){ 311 return 0; 312 }else if( parseHhMmSs(zDate, p)==0 ){ 313 return 0; 314 }else if( sqlite3StrICmp(zDate,"now")==0){ 315 double r; 316 sqlite3OsCurrentTime(&r); 317 p->rJD = r; 318 p->validJD = 1; 319 return 0; 320 }else if( sqlite3IsNumber(zDate, 0, SQLITE_UTF8) ){ 321 getValue(zDate, &p->rJD); 322 p->validJD = 1; 323 return 0; 324 } 325 return 1; 326 } 327 328 /* 329 ** Compute the Year, Month, and Day from the julian day number. 330 */ 331 static void computeYMD(DateTime *p){ 332 int Z, A, B, C, D, E, X1; 333 if( p->validYMD ) return; 334 if( !p->validJD ){ 335 p->Y = 2000; 336 p->M = 1; 337 p->D = 1; 338 }else{ 339 Z = p->rJD + 0.5; 340 A = (Z - 1867216.25)/36524.25; 341 A = Z + 1 + A - (A/4); 342 B = A + 1524; 343 C = (B - 122.1)/365.25; 344 D = 365.25*C; 345 E = (B-D)/30.6001; 346 X1 = 30.6001*E; 347 p->D = B - D - X1; 348 p->M = E<14 ? E-1 : E-13; 349 p->Y = p->M>2 ? C - 4716 : C - 4715; 350 } 351 p->validYMD = 1; 352 } 353 354 /* 355 ** Compute the Hour, Minute, and Seconds from the julian day number. 356 */ 357 static void computeHMS(DateTime *p){ 358 int Z, s; 359 if( p->validHMS ) return; 360 computeJD(p); 361 Z = p->rJD + 0.5; 362 s = (p->rJD + 0.5 - Z)*86400000.0 + 0.5; 363 p->s = 0.001*s; 364 s = p->s; 365 p->s -= s; 366 p->h = s/3600; 367 s -= p->h*3600; 368 p->m = s/60; 369 p->s += s - p->m*60; 370 p->validHMS = 1; 371 } 372 373 /* 374 ** Compute both YMD and HMS 375 */ 376 static void computeYMD_HMS(DateTime *p){ 377 computeYMD(p); 378 computeHMS(p); 379 } 380 381 /* 382 ** Clear the YMD and HMS and the TZ 383 */ 384 static void clearYMD_HMS_TZ(DateTime *p){ 385 p->validYMD = 0; 386 p->validHMS = 0; 387 p->validTZ = 0; 388 } 389 390 /* 391 ** Compute the difference (in days) between localtime and UTC (a.k.a. GMT) 392 ** for the time value p where p is in UTC. 393 */ 394 static double localtimeOffset(DateTime *p){ 395 DateTime x, y; 396 time_t t; 397 x = *p; 398 computeYMD_HMS(&x); 399 if( x.Y<1971 || x.Y>=2038 ){ 400 x.Y = 2000; 401 x.M = 1; 402 x.D = 1; 403 x.h = 0; 404 x.m = 0; 405 x.s = 0.0; 406 } else { 407 int s = x.s + 0.5; 408 x.s = s; 409 } 410 x.tz = 0; 411 x.validJD = 0; 412 computeJD(&x); 413 t = (x.rJD-2440587.5)*86400.0 + 0.5; 414 #ifdef HAVE_LOCALTIME_R 415 { 416 struct tm sLocal; 417 localtime_r(&t, &sLocal); 418 y.Y = sLocal.tm_year + 1900; 419 y.M = sLocal.tm_mon + 1; 420 y.D = sLocal.tm_mday; 421 y.h = sLocal.tm_hour; 422 y.m = sLocal.tm_min; 423 y.s = sLocal.tm_sec; 424 } 425 #else 426 { 427 struct tm *pTm; 428 sqlite3OsEnterMutex(); 429 pTm = localtime(&t); 430 y.Y = pTm->tm_year + 1900; 431 y.M = pTm->tm_mon + 1; 432 y.D = pTm->tm_mday; 433 y.h = pTm->tm_hour; 434 y.m = pTm->tm_min; 435 y.s = pTm->tm_sec; 436 sqlite3OsLeaveMutex(); 437 } 438 #endif 439 y.validYMD = 1; 440 y.validHMS = 1; 441 y.validJD = 0; 442 y.validTZ = 0; 443 computeJD(&y); 444 return y.rJD - x.rJD; 445 } 446 447 /* 448 ** Process a modifier to a date-time stamp. The modifiers are 449 ** as follows: 450 ** 451 ** NNN days 452 ** NNN hours 453 ** NNN minutes 454 ** NNN.NNNN seconds 455 ** NNN months 456 ** NNN years 457 ** start of month 458 ** start of year 459 ** start of week 460 ** start of day 461 ** weekday N 462 ** unixepoch 463 ** localtime 464 ** utc 465 ** 466 ** Return 0 on success and 1 if there is any kind of error. 467 */ 468 static int parseModifier(const char *zMod, DateTime *p){ 469 int rc = 1; 470 int n; 471 double r; 472 char *z, zBuf[30]; 473 z = zBuf; 474 for(n=0; n<sizeof(zBuf)-1 && zMod[n]; n++){ 475 z[n] = tolower(zMod[n]); 476 } 477 z[n] = 0; 478 switch( z[0] ){ 479 case 'l': { 480 /* localtime 481 ** 482 ** Assuming the current time value is UTC (a.k.a. GMT), shift it to 483 ** show local time. 484 */ 485 if( strcmp(z, "localtime")==0 ){ 486 computeJD(p); 487 p->rJD += localtimeOffset(p); 488 clearYMD_HMS_TZ(p); 489 rc = 0; 490 } 491 break; 492 } 493 case 'u': { 494 /* 495 ** unixepoch 496 ** 497 ** Treat the current value of p->rJD as the number of 498 ** seconds since 1970. Convert to a real julian day number. 499 */ 500 if( strcmp(z, "unixepoch")==0 && p->validJD ){ 501 p->rJD = p->rJD/86400.0 + 2440587.5; 502 clearYMD_HMS_TZ(p); 503 rc = 0; 504 }else if( strcmp(z, "utc")==0 ){ 505 double c1; 506 computeJD(p); 507 c1 = localtimeOffset(p); 508 p->rJD -= c1; 509 clearYMD_HMS_TZ(p); 510 p->rJD += c1 - localtimeOffset(p); 511 rc = 0; 512 } 513 break; 514 } 515 case 'w': { 516 /* 517 ** weekday N 518 ** 519 ** Move the date to the same time on the next occurrence of 520 ** weekday N where 0==Sunday, 1==Monday, and so forth. If the 521 ** date is already on the appropriate weekday, this is a no-op. 522 */ 523 if( strncmp(z, "weekday ", 8)==0 && getValue(&z[8],&r)>0 524 && (n=r)==r && n>=0 && r<7 ){ 525 int Z; 526 computeYMD_HMS(p); 527 p->validTZ = 0; 528 p->validJD = 0; 529 computeJD(p); 530 Z = p->rJD + 1.5; 531 Z %= 7; 532 if( Z>n ) Z -= 7; 533 p->rJD += n - Z; 534 clearYMD_HMS_TZ(p); 535 rc = 0; 536 } 537 break; 538 } 539 case 's': { 540 /* 541 ** start of TTTTT 542 ** 543 ** Move the date backwards to the beginning of the current day, 544 ** or month or year. 545 */ 546 if( strncmp(z, "start of ", 9)!=0 ) break; 547 z += 9; 548 computeYMD(p); 549 p->validHMS = 1; 550 p->h = p->m = 0; 551 p->s = 0.0; 552 p->validTZ = 0; 553 p->validJD = 0; 554 if( strcmp(z,"month")==0 ){ 555 p->D = 1; 556 rc = 0; 557 }else if( strcmp(z,"year")==0 ){ 558 computeYMD(p); 559 p->M = 1; 560 p->D = 1; 561 rc = 0; 562 }else if( strcmp(z,"day")==0 ){ 563 rc = 0; 564 } 565 break; 566 } 567 case '+': 568 case '-': 569 case '0': 570 case '1': 571 case '2': 572 case '3': 573 case '4': 574 case '5': 575 case '6': 576 case '7': 577 case '8': 578 case '9': { 579 n = getValue(z, &r); 580 assert( n>=1 ); 581 if( z[n]==':' ){ 582 /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the 583 ** specified number of hours, minutes, seconds, and fractional seconds 584 ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be 585 ** omitted. 586 */ 587 const char *z2 = z; 588 DateTime tx; 589 int day; 590 if( !isdigit(*(u8*)z2) ) z2++; 591 memset(&tx, 0, sizeof(tx)); 592 if( parseHhMmSs(z2, &tx) ) break; 593 computeJD(&tx); 594 tx.rJD -= 0.5; 595 day = (int)tx.rJD; 596 tx.rJD -= day; 597 if( z[0]=='-' ) tx.rJD = -tx.rJD; 598 computeJD(p); 599 clearYMD_HMS_TZ(p); 600 p->rJD += tx.rJD; 601 rc = 0; 602 break; 603 } 604 z += n; 605 while( isspace(*(u8*)z) ) z++; 606 n = strlen(z); 607 if( n>10 || n<3 ) break; 608 if( z[n-1]=='s' ){ z[n-1] = 0; n--; } 609 computeJD(p); 610 rc = 0; 611 if( n==3 && strcmp(z,"day")==0 ){ 612 p->rJD += r; 613 }else if( n==4 && strcmp(z,"hour")==0 ){ 614 p->rJD += r/24.0; 615 }else if( n==6 && strcmp(z,"minute")==0 ){ 616 p->rJD += r/(24.0*60.0); 617 }else if( n==6 && strcmp(z,"second")==0 ){ 618 p->rJD += r/(24.0*60.0*60.0); 619 }else if( n==5 && strcmp(z,"month")==0 ){ 620 int x, y; 621 computeYMD_HMS(p); 622 p->M += r; 623 x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; 624 p->Y += x; 625 p->M -= x*12; 626 p->validJD = 0; 627 computeJD(p); 628 y = r; 629 if( y!=r ){ 630 p->rJD += (r - y)*30.0; 631 } 632 }else if( n==4 && strcmp(z,"year")==0 ){ 633 computeYMD_HMS(p); 634 p->Y += r; 635 p->validJD = 0; 636 computeJD(p); 637 }else{ 638 rc = 1; 639 } 640 clearYMD_HMS_TZ(p); 641 break; 642 } 643 default: { 644 break; 645 } 646 } 647 return rc; 648 } 649 650 /* 651 ** Process time function arguments. argv[0] is a date-time stamp. 652 ** argv[1] and following are modifiers. Parse them all and write 653 ** the resulting time into the DateTime structure p. Return 0 654 ** on success and 1 if there are any errors. 655 */ 656 static int isDate(int argc, sqlite3_value **argv, DateTime *p){ 657 int i; 658 const unsigned char *z; 659 if( argc==0 ) return 1; 660 if( (z = sqlite3_value_text(argv[0]))==0 || parseDateOrTime((char*)z, p) ){ 661 return 1; 662 } 663 for(i=1; i<argc; i++){ 664 if( (z = sqlite3_value_text(argv[i]))==0 || parseModifier((char*)z, p) ){ 665 return 1; 666 } 667 } 668 return 0; 669 } 670 671 672 /* 673 ** The following routines implement the various date and time functions 674 ** of SQLite. 675 */ 676 677 /* 678 ** julianday( TIMESTRING, MOD, MOD, ...) 679 ** 680 ** Return the julian day number of the date specified in the arguments 681 */ 682 static void juliandayFunc( 683 sqlite3_context *context, 684 int argc, 685 sqlite3_value **argv 686 ){ 687 DateTime x; 688 if( isDate(argc, argv, &x)==0 ){ 689 computeJD(&x); 690 sqlite3_result_double(context, x.rJD); 691 } 692 } 693 694 /* 695 ** datetime( TIMESTRING, MOD, MOD, ...) 696 ** 697 ** Return YYYY-MM-DD HH:MM:SS 698 */ 699 static void datetimeFunc( 700 sqlite3_context *context, 701 int argc, 702 sqlite3_value **argv 703 ){ 704 DateTime x; 705 if( isDate(argc, argv, &x)==0 ){ 706 char zBuf[100]; 707 computeYMD_HMS(&x); 708 sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d", 709 x.Y, x.M, x.D, x.h, x.m, (int)(x.s)); 710 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); 711 } 712 } 713 714 /* 715 ** time( TIMESTRING, MOD, MOD, ...) 716 ** 717 ** Return HH:MM:SS 718 */ 719 static void timeFunc( 720 sqlite3_context *context, 721 int argc, 722 sqlite3_value **argv 723 ){ 724 DateTime x; 725 if( isDate(argc, argv, &x)==0 ){ 726 char zBuf[100]; 727 computeHMS(&x); 728 sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s); 729 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); 730 } 731 } 732 733 /* 734 ** date( TIMESTRING, MOD, MOD, ...) 735 ** 736 ** Return YYYY-MM-DD 737 */ 738 static void dateFunc( 739 sqlite3_context *context, 740 int argc, 741 sqlite3_value **argv 742 ){ 743 DateTime x; 744 if( isDate(argc, argv, &x)==0 ){ 745 char zBuf[100]; 746 computeYMD(&x); 747 sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D); 748 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); 749 } 750 } 751 752 /* 753 ** strftime( FORMAT, TIMESTRING, MOD, MOD, ...) 754 ** 755 ** Return a string described by FORMAT. Conversions as follows: 756 ** 757 ** %d day of month 758 ** %f ** fractional seconds SS.SSS 759 ** %H hour 00-24 760 ** %j day of year 000-366 761 ** %J ** Julian day number 762 ** %m month 01-12 763 ** %M minute 00-59 764 ** %s seconds since 1970-01-01 765 ** %S seconds 00-59 766 ** %w day of week 0-6 sunday==0 767 ** %W week of year 00-53 768 ** %Y year 0000-9999 769 ** %% % 770 */ 771 static void strftimeFunc( 772 sqlite3_context *context, 773 int argc, 774 sqlite3_value **argv 775 ){ 776 DateTime x; 777 int n, i, j; 778 char *z; 779 const char *zFmt = (const char*)sqlite3_value_text(argv[0]); 780 char zBuf[100]; 781 if( zFmt==0 || isDate(argc-1, argv+1, &x) ) return; 782 for(i=0, n=1; zFmt[i]; i++, n++){ 783 if( zFmt[i]=='%' ){ 784 switch( zFmt[i+1] ){ 785 case 'd': 786 case 'H': 787 case 'm': 788 case 'M': 789 case 'S': 790 case 'W': 791 n++; 792 /* fall thru */ 793 case 'w': 794 case '%': 795 break; 796 case 'f': 797 n += 8; 798 break; 799 case 'j': 800 n += 3; 801 break; 802 case 'Y': 803 n += 8; 804 break; 805 case 's': 806 case 'J': 807 n += 50; 808 break; 809 default: 810 return; /* ERROR. return a NULL */ 811 } 812 i++; 813 } 814 } 815 if( n<sizeof(zBuf) ){ 816 z = zBuf; 817 }else{ 818 z = sqliteMalloc( n ); 819 if( z==0 ) return; 820 } 821 computeJD(&x); 822 computeYMD_HMS(&x); 823 for(i=j=0; zFmt[i]; i++){ 824 if( zFmt[i]!='%' ){ 825 z[j++] = zFmt[i]; 826 }else{ 827 i++; 828 switch( zFmt[i] ){ 829 case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; 830 case 'f': { 831 double s = x.s; 832 if( s>59.999 ) s = 59.999; 833 sqlite3_snprintf(7, &z[j],"%06.3f", s); 834 j += strlen(&z[j]); 835 break; 836 } 837 case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; 838 case 'W': /* Fall thru */ 839 case 'j': { 840 int nDay; /* Number of days since 1st day of year */ 841 DateTime y = x; 842 y.validJD = 0; 843 y.M = 1; 844 y.D = 1; 845 computeJD(&y); 846 nDay = x.rJD - y.rJD + 0.5; 847 if( zFmt[i]=='W' ){ 848 int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ 849 wd = ((int)(x.rJD+0.5)) % 7; 850 sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); 851 j += 2; 852 }else{ 853 sqlite3_snprintf(4, &z[j],"%03d",nDay+1); 854 j += 3; 855 } 856 break; 857 } 858 case 'J': { 859 sqlite3_snprintf(20, &z[j],"%.16g",x.rJD); 860 j+=strlen(&z[j]); 861 break; 862 } 863 case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; 864 case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; 865 case 's': { 866 sqlite3_snprintf(30,&z[j],"%d", 867 (int)((x.rJD-2440587.5)*86400.0 + 0.5)); 868 j += strlen(&z[j]); 869 break; 870 } 871 case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; 872 case 'w': z[j++] = (((int)(x.rJD+1.5)) % 7) + '0'; break; 873 case 'Y': sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=strlen(&z[j]);break; 874 case '%': z[j++] = '%'; break; 875 } 876 } 877 } 878 z[j] = 0; 879 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); 880 if( z!=zBuf ){ 881 sqliteFree(z); 882 } 883 } 884 885 /* 886 ** current_time() 887 ** 888 ** This function returns the same value as time('now'). 889 */ 890 static void ctimeFunc( 891 sqlite3_context *context, 892 int argc, 893 sqlite3_value **argv 894 ){ 895 sqlite3_value *pVal = sqlite3ValueNew(); 896 if( pVal ){ 897 sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); 898 timeFunc(context, 1, &pVal); 899 sqlite3ValueFree(pVal); 900 } 901 } 902 903 /* 904 ** current_date() 905 ** 906 ** This function returns the same value as date('now'). 907 */ 908 static void cdateFunc( 909 sqlite3_context *context, 910 int argc, 911 sqlite3_value **argv 912 ){ 913 sqlite3_value *pVal = sqlite3ValueNew(); 914 if( pVal ){ 915 sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); 916 dateFunc(context, 1, &pVal); 917 sqlite3ValueFree(pVal); 918 } 919 } 920 921 /* 922 ** current_timestamp() 923 ** 924 ** This function returns the same value as datetime('now'). 925 */ 926 static void ctimestampFunc( 927 sqlite3_context *context, 928 int argc, 929 sqlite3_value **argv 930 ){ 931 sqlite3_value *pVal = sqlite3ValueNew(); 932 if( pVal ){ 933 sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); 934 datetimeFunc(context, 1, &pVal); 935 sqlite3ValueFree(pVal); 936 } 937 } 938 #endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */ 939 940 #ifdef SQLITE_OMIT_DATETIME_FUNCS 941 /* 942 ** If the library is compiled to omit the full-scale date and time 943 ** handling (to get a smaller binary), the following minimal version 944 ** of the functions current_time(), current_date() and current_timestamp() 945 ** are included instead. This is to support column declarations that 946 ** include "DEFAULT CURRENT_TIME" etc. 947 ** 948 ** This function uses the C-library functions time(), gmtime() 949 ** and strftime(). The format string to pass to strftime() is supplied 950 ** as the user-data for the function. 951 */ 952 static void currentTimeFunc( 953 sqlite3_context *context, 954 int argc, 955 sqlite3_value **argv 956 ){ 957 time_t t; 958 char *zFormat = (char *)sqlite3_user_data(context); 959 char zBuf[20]; 960 961 time(&t); 962 #ifdef SQLITE_TEST 963 { 964 extern int sqlite3_current_time; /* See os_XXX.c */ 965 if( sqlite3_current_time ){ 966 t = sqlite3_current_time; 967 } 968 } 969 #endif 970 971 #ifdef HAVE_GMTIME_R 972 { 973 struct tm sNow; 974 gmtime_r(&t, &sNow); 975 strftime(zBuf, 20, zFormat, &sNow); 976 } 977 #else 978 { 979 struct tm *pTm; 980 sqlite3OsEnterMutex(); 981 pTm = gmtime(&t); 982 strftime(zBuf, 20, zFormat, pTm); 983 sqlite3OsLeaveMutex(); 984 } 985 #endif 986 987 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); 988 } 989 #endif 990 991 /* 992 ** This function registered all of the above C functions as SQL 993 ** functions. This should be the only routine in this file with 994 ** external linkage. 995 */ 996 void sqlite3RegisterDateTimeFunctions(sqlite3 *db){ 997 #ifndef SQLITE_OMIT_DATETIME_FUNCS 998 static const struct { 999 char *zName; 1000 int nArg; 1001 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 1002 } aFuncs[] = { 1003 { "julianday", -1, juliandayFunc }, 1004 { "date", -1, dateFunc }, 1005 { "time", -1, timeFunc }, 1006 { "datetime", -1, datetimeFunc }, 1007 { "strftime", -1, strftimeFunc }, 1008 { "current_time", 0, ctimeFunc }, 1009 { "current_timestamp", 0, ctimestampFunc }, 1010 { "current_date", 0, cdateFunc }, 1011 }; 1012 int i; 1013 1014 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){ 1015 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg, 1016 SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0); 1017 } 1018 #else 1019 static const struct { 1020 char *zName; 1021 char *zFormat; 1022 } aFuncs[] = { 1023 { "current_time", "%H:%M:%S" }, 1024 { "current_date", "%Y-%m-%d" }, 1025 { "current_timestamp", "%Y-%m-%d %H:%M:%S" } 1026 }; 1027 int i; 1028 1029 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){ 1030 sqlite3CreateFunc(db, aFuncs[i].zName, 0, SQLITE_UTF8, 1031 aFuncs[i].zFormat, currentTimeFunc, 0, 0); 1032 } 1033 #endif 1034 } 1035