Я хочу найти таблицу базы данных с замаскированной (XXXX-XX-XX) датой с помощью c # или sql - PullRequest
0 голосов
/ 20 декабря 2018

Мой тип данных столбца даты - "nvarchar".Мой столбец даты будет выглядеть как XXXX-XX-XX (ГГГГ-ММ-ДД).Здесь XX - это любое число, например 2018-XX-01

Моя таблица содержит записи ниже

ID DOB
-- ------------
 1  2018-01-01
 2  2018-04-01
 3  2018-XX-01

Сценарий 1 Когда я запрашиваю дату 2018-01-01 в то время, я хочу получить результат ниже

2018-01-01
2018-XX-01

потому что XX - это любое число.

Сценарий 2 Когда я запрашиваю дату 2018-XX-01 в то время, я хочу получить результат ниже

2018-01-01
2018-XX-01
2018-04-01

, потому что XX - это любое нет

Здесь XX будут в любой позиции, например, год, месяц, день.

Может кто-нибудь предложить решение на SQL или C #.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вот решение с использованием IEqualityComparer

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication93
{
    class Program
    {

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("DOB", typeof(string));

            dt.Rows.Add(new object[] {1,"2018-01-01"});
            dt.Rows.Add(new object[] {2,"2018-04-01"} );
            dt.Rows.Add(new object[] { 3, "2018-XX-01" });

            MyDate myDate = new MyDate();
            var results1 = dt.AsEnumerable()
                .Where(x => myDate.Equals(x.Field<string>("DOB"),"2018-01-01"))
                .ToList();

            var results2 = dt.AsEnumerable()
                 .Where(x => myDate.Equals(x.Field<string>("DOB"), "2018-XX-01"))
                 .ToList();

        }
    }
    public class MyDate : IEqualityComparer  
    {

        public new Boolean Equals(object x, object y)
        {
            string[] dateArrayX = ((string)x).Split(new char[] { '-' });
            string[] dateArrayY = ((string)y).Split(new char[] { '-' });

            Boolean yearCompare = (dateArrayX[0] == "XXXX") | (dateArrayY[0] == "XXXX") | (dateArrayX[0] == dateArrayY[0]);
            Boolean monthCompare = (dateArrayX[1] == "XX") | (dateArrayY[1] == "XX") | (dateArrayX[1] == dateArrayY[1]);
            Boolean dayCompare = (dateArrayX[2] == "XX") | (dateArrayY[2] == "XX") | (dateArrayX[2] == dateArrayY[2]);

            return yearCompare & monthCompare & dayCompare;

        }
        public int GetHashCode(object obj)
        {
            return obj.ToString().ToLower().GetHashCode();
        }
    }



}
0 голосов
/ 20 декабря 2018

Хммм.Я думаю, что вы можете использовать like, но в обоих направлениях:

where @datestr like replace(dob, 'XX', '%') or
      dob like replace(@datestr, 'XX', '%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...