                 // Prefer DatabaseValueConvertible decoding over Decodable.
                 // This allows decoding Date from String, or DatabaseValue from NULL.
                 if type == Date.self {
-                    return decodeDate(fromRow: row, columnAtIndex: index, key: key) as! T
+                    return Record.databaseDateDecodingStrategy.decode(fromRow: row, columnAtIndex: index) as! T
                 } else if let type = T.self as? (DatabaseValueConvertible & StatementColumnConvertible).Type {
                     return type.fastDecode(from: row, atUncheckedIndex: index) as! T
                 } else if let type = T.self as? DatabaseValueConvertible.Type {

    func decode<T>(_ type: T.Type) throws -> T where T : Decodable {
        // Prefer DatabaseValueConvertible decoding over Decodable.
        // This allows decoding Date from String, or DatabaseValue from NULL.
        if let type = T.self as? (DatabaseValueConvertible & StatementColumnConvertible).Type {
            return type.fastDecode(from: row, atUncheckedIndex: columnIndex) as! T
        } else if let type = T.self as? DatabaseValueConvertible.Type {
            return type.decode(from: row, atUncheckedIndex: columnIndex) as! T

}()

private extension DatabaseDateDecodingStrategy {
    @inline(__always)
    func decodeIfPresent(fromRow row: Row, columnAtIndex index: Int) -> Date? {
        if let sqliteStatement = row.sqliteStatement {
            return decodeIfPresent(
                sqliteStatement: sqliteStatement,
                index: Int32(index))
        } else {
            return decodeIfPresent(
                from: row[index],
                conversionContext: ValueConversionContext(row).atColumn(index))
        }
    }
    
    @inline(__always)
    func decode(fromRow row: Row, columnAtIndex index: Int) -> Date {
        if let sqliteStatement = row.sqliteStatement {
            return decode(
                sqliteStatement: sqliteStatement,
                index: Int32(index))
        } else {
            return decode(
                from: row[index],
                conversionContext: ValueConversionContext(row).atColumn(index))
        }
    }
    
    @inline(__always)
    func decode(sqliteStatement: SQLiteStatement, index: Int32) -> Date {
        switch self {
