quarta-feira, 26 de abril de 2023

SQL DATEDIFF

Se você deseja retornar o número de dias, anos, meses ou outro valor desejado. Utilize a funçao DATEDIFF. 

Essa função retorna a contagem dos limites especificados de datepart entre os parâmetros especificados startdate e enddate.


Sintaxe:

DATEDIFF ( datepart , startdate , enddate )


Nota:

DATEDIFF relata a diferença entre startdate e enddate. Unidades de datepart usadas com frequência incluem month ou second.

O valor de datepart não pode ser especificado em uma variável, nem como uma cadeia de caracteres entre aspas, como 'month'.

O valor de datepart não pode ser especificado em uma variável, nem como uma cadeia de caracteres entre aspas, como 'month'.

Use anos de quatro dígitos para evitar ambiguidade.

O tipo de retorno e um INT.


Tabela com todos os valores válidos de datepart

Nome do datepartAbreviação do datepart
yeary, yy, yyyy
quarterqq, q
monthmm, m
dayofyeardy
daydd, d
weekwk, ww
hourhh
minutemi, n
secondss, s
millisecondms
microsecondmcs
nanosecondns

Uma expressão que pode resolver um dos seguintes valores:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time


Exemplos com datepart


SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(microsecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');



sexta-feira, 14 de abril de 2023

IdentityUser - Exemplo Prático

 É uma biblioteca de gerenciamento de usuários da Microsoft para ASP.NET. Ela é chamada de Identidade (Identity) ASP.NET. Ela contém recursos, incluindo hash de senha, validação de senha, armazenamento de usuários e gerenciamento de reivindicações. Ela normalmente inclui alguns recursos básicos de autenticação, como cookies e autenticação multifator. Ela pode até mesmo introduzir sua própria interface de usuário em alguns casos.

Todas as estruturas, incluindo MVC ASP.NET, Web Forms e Web Pages, podem usar o ASP.NET Identity. As informações do usuário são armazenadas em um banco de dados por padrão no ASP.NET Identity. Também é viável armazenar dados em uma variedade de provedores de armazenamento, dependendo das necessidades do aplicativo. SharePoint, serviços de tabela do Azure e outras fontes de dados (exemplos de provedores de dados).

No ASP.NET Identity, a autorização baseada em função também é muito significativa. Agora podemos definir facilmente funções como "Administrador", "Cliente" e assim por diante, o que nos permite atribuir usuários a essas funções e restringir seu acesso a algumas áreas do programa.

O Identificador de ASP.NET é um divisor de águas, pois introduz a Autenticação de Dois Fatores em seu aplicativo Web.

Porém, ela possui um conjunto muito limitado de propriedades, mas é possivel extender. É isso que você irá aprender agora.

 

public class IdentityUser<TKeywhere TKey : IEquatable<TKey>

{

    public IdentityUser() { }

    public IdentityUser(string userName) : this()

    {

        UserName = userName;

    }

    [PersonalData]

    public virtual TKey Id { getset; }

    [ProtectedPersonalData]

    public virtual string UserName { getset; }

    public virtual string NormalizedUserName { getset; }

    [ProtectedPersonalData]

    public virtual string Email { getset; }

    public virtual string NormalizedEmail { getset; }

    [PersonalData]

    public virtual bool EmailConfirmed { getset; }

    public virtual string PasswordHash { getset; }

    public virtual string SecurityStamp { getset; }

    public virtual string ConcurrencyStamp { getset; } = Guid.NewGuid().ToString();

    [ProtectedPersonalData]

    public virtual string PhoneNumber { getset; }

    [PersonalData]

    public virtual bool PhoneNumberConfirmed { getset; }

    [PersonalData]

    public virtual bool TwoFactorEnabled { getset; }

    public virtual DateTimeOffset? LockoutEnd { getset; }

    public virtual bool LockoutEnabled { getset; }

    public virtual int AccessFailedCount { getset; }

    public override string ToString()

        => UserName;

}

  

Estender IdentityUser Class

Você pode nomear a classe que estende a classe IdentityUser como quiser, mas é costume nomeá-la como ApplicationUser. No exemplo abaixo, a classe ApplicationUser  estende a classe IdentityUser .

 public class ApplicationUser : IdentityUser

{

    public string City { getset; }

}

Para encontre todas as referências da classe IdentityUser e substitui-la por nossa classe personalizada ApplicationUser , clique com o botão direito do mouse na classe IdentityUser e, em seguida, selecionar "Localizar todas as referências" no menu de contexto. Navegue até cada referência na lista e substitua a classe IdentityUser pela classe ApplicationUser.

 



Especifique a classe ApplicationUser como o argumento genérico para a classe IdentityDbContext. É assim que a classe IdentityDbContext sabe que precisa trabalhar com nossa classe de usuário personalizada (neste caso, a classe ApplicationUser) em vez da classeIdentityUser interna padrão.

public class AppDbContext : IdentityDbContext<ApplicationUser>

{

    public AppDbContext(DbContextOptions<AppDbContext> options)

        : base(options)

    { }

 

    public DbSet<Employee> Employees { getset; }

 

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Seed();

    }

}

  

Gerar uma nova migração para adicionar colunas à tabela AspNetUsers

Add-Migration Extend_IdentityUser, este comando gera o código de migração necessário para adicionar a coluna Cidade à tabela AspNetUsers.

 

Extend_IdentityUser de classe parcial pública : Migração

{

protected override void Up(MigrationBuilder migrationBuilder)

    {

migrationBuilder.AddColumn<string>(

nome: "Cidade",

tabela: "AspNetUsers",

anulável: verdadeiro);

    }

 

protected override void Down(MigrationBuilder migrationBuilder)

    {

migrationBuilder.DropColumn(

nome: "Cidade",

tabela: "AspNetUsers");

    }

}

 

Em seguida, aplique a migração ao banco de dados usando o seguinte comando: Update-Database

 

 

Estendendo IdentityUser - Add-Migration Não está funcionando

Se a classe ApplicationUser (a classe que estende a classe IdentityUser) não for especificada como o argumento genérico para a classe IdentityDbContext, o comando Add-Migration não funcionará. Ele não gera o código de migração necessário para adicionar as colunas adicionais à tabela de identidade AspNetUsers.Para corrigir isso, especifique a classe ApplicationUser como o argumento genérico para a classe IdentityDbContext.

 

public class AppDbContext : IdentityDbContext<ApplicationUser>

{

    public AppDbContext(DbContextOptions<AppDbContext> options)

        : base(options)

    { }

 

    public DbSet<Employee> Employees { getset; }

 

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Seed();

    }

}

 

Se você obtiver a seguinte exceção, a causa mais provável é em algum lugar com em seu aplicativo você ainda está usando classe IdentityUser em vez da classe ApplicationUser.

 

No service for type 'Microsoft.AspNetCore.Identity.SignInManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.

 

No Visual Studio, procure a classe IdentityUser em todo o aplicativo usando CTRL + SHIFT + F

 


 

Substitua a classe IdentityUser pela classe ApplicationUser e execute novamente o projeto.

 

Para poder armazenar dados para a coluna Cidade personalizada na tabela AspNetUsers precisamos alterar

· RegisterViewModel classe

· Registrar Visualização

· Registrar ação no AccountController

 

Classe RegisterViewModel Esta é a classe de modelo para o modo de exibição Register. Modifique-o para incluir a propriedade City.

 

public class RegisterViewModel{

    // Other Properties

    public string City { getset; }

}

 

Register View

inclua um campo para capturar um valor para a Cidade.

 

@model RegisterViewModel

 

@{

    ViewBag.Title = "User Registration";

}

 <h1>User Registration</h1>

 

<div class="row">

    <div class="col-md-12">

        <form method="post">

            <div asp-validation-summary="All" class="text-danger"></div>

            <div class="form-group">

                <label asp-for="Email"></label>

                <input asp-for="Email" class="form-control" />

                <span asp-validation-for="Email" class="text-danger"></span>

            </div>

 

            @*Other Fields*@

 

            <div class="form-group">

                <label asp-for="City"></label>

                <input asp-for="City" class="form-control" />

            </div>

 

            <button type="submit" class="btn btn-primary">Register</button>

        </form>

    </div>

</div>

 

AccountController - Ação de registro

· Preencha a propriedade City da instância ApplicationUser que é passada para o método CreateAsync() da classe UserManager.

· Os dados na instância ApplicationUser são salvos na tabela AspNetUsers pela classe IdentityDbContext.

 

[HttpPost]

[AllowAnonymous]

public async Task<IActionResult> Register(RegisterViewModel model)

{

    if (ModelState.IsValid)

    {

        var user = new ApplicationUser

        {

            UserName = model.Email,

            Email = model.Email,

            City = model.City

        };

 

        var result = await userManager.CreateAsync(user, model.Password);

 

        if (result.Succeeded)

        {

            await signInManager.SignInAsync(user, isPersistent: false);

            return RedirectToAction("index""home");

        }

 

        foreach (var error in result.Errors)

        {

            ModelState.AddModelError(string.Empty, error.Description);

        }

    }

 

    return View(model);

}