# Database Date/Time Fix Script

This script fixes date and time format issues in the `OptionsFlow_monthly` and `options_flow` tables.

## What It Fixes

1. **CreatedDate** - Normalizes all dates to `YYYY-MM-DD` format
   - Converts `MM/DD/YYYY` → `YYYY-MM-DD`
   - Converts `M/D/YYYY` → `YYYY-MM-DD`
   - Keeps already valid `YYYY-MM-DD` dates

2. **CreatedTime** - Normalizes all times to `HH:MM:SS AM/PM` format with consistent spacing
   - Adds space before AM/PM: `"3:59:59PM"` → `"3:59:59 PM"`
   - Fixes missing seconds: `"3:59 PM"` → `"3:59:00 PM"`
   - Fixes missing colon: `"359PM"` → `"3:59:00 PM"`
   - Fixes missing hour: `":59 AM"` → `"9:59:00 AM"`

3. **ExpirationDate** - Normalizes to `YYYY-MM-DD` format
   - Same normalization as CreatedDate

4. **options_flow table** - Fixes invalid timestamps
   - Sets NULL for dates outside valid range
   - Updates invalid `created_at` to current time

## Usage

### Option 1: Run SQL File Directly

```bash
# Connect to your PostgreSQL database
psql -h localhost -U postgres -d institutional_trader

# Run the fix script
\i backend/database/fix_all_dates_and_times.sql
```

### Option 2: Use Node.js Script

```bash
# Analyze current state (no changes)
node backend/scripts/fixDatabaseDates.js analyze

# Run fixes
node backend/scripts/fixDatabaseDates.js fix

# Verify fixes
node backend/scripts/fixDatabaseDates.js verify

# Run all (analyze, fix, verify)
node backend/scripts/fixDatabaseDates.js all
```

### Option 3: Use in Supabase SQL Editor

1. Open Supabase Dashboard → SQL Editor
2. Copy contents of `fix_all_dates_and_times.sql`
3. Paste and run in SQL Editor

## What to Expect

### Before Fix:
```
CreatedDate: "12/17/2025", "2025-12-17", "12-17-2025"
CreatedTime: "3:59:59PM", "359PM", "3:59 PM", ":59 AM"
```

### After Fix:
```
CreatedDate: "2025-12-17" (all normalized)
CreatedTime: "3:59:59 PM" (all with space, consistent format)
```

## Safety

- **Read-only analysis first**: Run `analyze` command to see what will be changed
- **Non-destructive**: Script only updates format, doesn't delete data
- **Idempotent**: Safe to run multiple times (won't change already-correct data)
- **Verification**: Includes verification queries to check results

## Database Requirements

- PostgreSQL 12+ recommended
- Connection to `OptionsFlow_monthly` table
- Sufficient permissions for UPDATE operations

## Troubleshooting

### Permission Errors
```sql
-- Grant necessary permissions
GRANT UPDATE ON "OptionsFlow_monthly" TO your_user;
```

### Timeout Errors
```sql
-- For large tables, increase timeout
SET statement_timeout = '10min';
```

### Check Specific Records
```sql
-- See problematic entries
SELECT "CreatedDate", "CreatedTime", "Symbol"
FROM "OptionsFlow_monthly"
WHERE "CreatedTime"::text !~ '^\d{1,2}:\d{2}(:\d{2})?\s+[AP]M$'
  AND "CreatedTime" IS NOT NULL
LIMIT 100;
```

## Notes

- Script preserves NULL values (doesn't change them)
- Ambiguous formats (like "12 AM" - could be hour or minute) default to hour format
- Large tables may take several minutes to update
- Recommended to backup database before running on production

