Posts Categorizados ‘syslanguages

15
ago
09

Trabalhando com datas – Lista de meses e dias da semana

Pessoal, no último post relacionei funções para trabalhar com campos do tipo data, acabei recebendo um bom feedback e algumas perguntas sobre como relacionar todos os meses ou dias da semana por meio de query. Para responder estas perguntas, relacionei formas de gerar listas com os meses e dias da semana por meio de CTE.

Nestas duas primeiras queries, faço uso de um CTE recursivo básico, com as funções DATENAME e DATEADD e a instrução SET LANGUAGE para definir o idioma ‘Brasileiro’. Estas queries são bem mais simples e tornam mais fácil trazer novos campos. 

Tips:
1: Os campos de data quando somados a tipos inteiros, adicionam o valor dos inteiros em dias.
2: A função DATEADD simplifica a adição de outros quantitativos como meses, horas e anos.
3: O inteiro ’0′ (zero) quando convertido para data se torna ’1900-01-01 00:00:00.000′, uma segunda-feira.
4: O inteiro ‘-1′ quando convertido para data se torna ’1899-12-31 00:00:00.000′, um domingo.

Gerando uma lista de meses:

SET LANGUAGE 'Brazilian'
;WITH Meses AS
(
  SELECT 1 AS IdMes, DATENAME(MONTH, 0) AS NomeMes
  UNION ALL
  SELECT IdMes + 1, DATENAME(MONTH, DATEADD(MONTH, IdMes, 0))
  FROM Meses
  WHERE IdMes < 12
)
SELECT * FROM Meses

Gerando uma lista de dias da semana começando pelo domingo:

SET LANGUAGE 'Brazilian'
;WITH DiaSemana AS
(
  SELECT 1 AS idDSe, DATENAME(WEEKDAY, -1) AS nomeDSe
  UNION ALL
  SELECT idDSe + 1, DATENAME(WEEKDAY, idDSe -1)
  FROM DiaSemana
  WHERE idDSe < 7
)
SELECT idDSe, nomeDSe FROM DiaSemana

Ou pela Segunda-Feira:

SET LANGUAGE 'Brazilian'
;WITH DiaSemana AS
(
  SELECT 1 AS idDSe, DATENAME(WEEKDAY, 0) AS nomeDSe
  UNION ALL
  SELECT idDSe + 1, DATENAME(WEEKDAY, idDSe)
  FROM DiaSemana
  WHERE idDSe < 7
)
SELECT idDSe, nomeDSe FROM DiaSemana

Nas duas próximas queries, avanço um pouco a complexidade das CTEs, utilizando a view syslanguage e uma CTE de Split que modifiquei do site do Zavaschi. Elas realmente se diferenciam pelo campo utilizado da syslanguages facilitando alterações neste sentido.

Gerando uma lista dos meses:

DECLARE @Texto VARCHAR(8000),
        @Delimitador CHAR
SET @Texto = (SELECT months FROM sys.syslanguages WHERE alias = 'Brazilian')
SET @Delimitador = ','
;WITH _SPLIT(ID, _INDEX, _LENGTH) AS
(
  SELECT
    1,
    1,
    CHARINDEX(@Delimitador, @Texto + @Delimitador)
UNION ALL
  SELECT
    ID + 1,
    _LENGTH + 1,
    CHARINDEX(@Delimitador, @Texto + @Delimitador, _LENGTH + 1)
  FROM _SPLIT
  WHERE CHARINDEX(@Delimitador, @Texto + @Delimitador, _LENGTH + 1) <> 0
)
, Meses (idMes, nomeMes) AS
(
  SELECT
    ID,
    SUBSTRING(@Texto, _INDEX, _LENGTH - _INDEX)
  FROM _SPLIT
)
SELECT idMes, nomeMes FROM Meses

Gerando uma lista de dias da semana:

DECLARE @Texto VARCHAR(8000),
        @Delimitador CHAR
SET @Texto = (SELECT days FROM sys.syslanguages WHERE alias = 'Brazilian')
SET @Delimitador = ','
;WITH _SPLIT(ID, _INDEX, _LENGTH) AS
(
  SELECT
    1,
    1,
    CHARINDEX(@Delimitador, @Texto + @Delimitador)
UNION ALL
  SELECT
    ID + 1,
    _LENGTH + 1,
    CHARINDEX(@Delimitador, @Texto + @Delimitador, _LENGTH + 1)
  FROM _SPLIT
  WHERE CHARINDEX(@Delimitador, @Texto + @Delimitador, _LENGTH + 1) <> 0
)
, DiaSemana (idDSe, nomeDSe) AS
(
  SELECT
    ID,
    SUBSTRING(@Texto, _INDEX, _LENGTH - _INDEX)
  FROM _SPLIT
)
SELECT idDSe, nomeDSe FROM DiaSemana

Eu espero que elas respondam as necessidades que venham a aparecer!

Não se esqueçam de comentar!

08
ago
09

Trabalhando com datas – Extraindo informações

Boa noite pessoal!

Continuando o tópico “trabalhando com datas”, continuarei a relacionar algumas dificuldades com extrair informações de tipos DATETIME.

Função responsável por obter a data e hora atual:

GETDATE()
Ou
CURRENT_TIMESTAMP

Outras funções utilizadas para obter de pequenos fragmentos de datas como ano, hora, dia:

Função Exemplo
DAY SELECT DAY(GETDATE())
MONTH SELECT MONTH(GETDATE())
YEAR SELECT YEAR(GETDATE())

Obs.: As três funções acima não funcionam em SQL CE.

Para obter informações sobre dia de semana, hora, minuto, segundo e outras, não é possível pelas três funções acima, sendo necessário utilizar a função DATEPART, exemplo:

SELECT DATEPART(YEAR, GETDATE())
SELECT DATEPART(MONTH, GETDATE())
SELECT DATEPART(WEEKDAY, GETDATE())
SELECT DATEPART(DAY, GETDATE())
SELECT DATEPART(HOUR, GETDATE())
SELECT DATEPART(MINUTE, GETDATE())
SELECT DATEPART(SECOND, GETDATE())

Na biblioteca do MSDN, também existe uma relação de todas as dateparts possíveis:
http://msdn.microsoft.com/en-us/library/ms174420.aspx

Também existe a função DATENAME, que retorna, quando possível, o nome do mês ou do dia da semana, exemplo:

SELECT DATENAME(MONTH, GETDATE())
SELECT DATENAME(WEEKDAY, GETDATE())

Pequeno detalhe, se o servidor estiver no idioma inglês será necessário utilizar a seguinte instrução:

SET LANGUAGE 'Brazilian'
Ou
SET LANGUAGE 'Portuguese'

Obs.: No SQL Server, o idioma Brasileiro existe e funciona melhor que o português, exemplo:

SET LANGUAGE 'Portuguese'
SELECT DATENAME(MONTH, GETDATE()), DATENAME(WEEKDAY, GETDATE())
Ou
SET LANGUAGE 'Brazilian'
SELECT DATENAME(MONTH, GETDATE()), DATENAME(WEEKDAY, GETDATE())

A relação dos idiomas possíveis pode ser conseguida pela view:

SELECT * FROM syslanguages

Somente para completar o post anterior, abaixo as funções para pegar dia/mês/ano e hora:minuto:segundo:

SELECT CONVERT(VARCHAR(8),GETDATE(),103)
SELECT CONVERT(VARCHAR(8),GETDATE(),108)

E o diferencial de trabalhar com SQL Server 2008, onde existem os tipos DATE e TIME, sendo possível obter estas informações até mesmo por um simples cast: 

SELECT CAST(GETDATE() AS DATE)
SELECT CAST(GETDATE() AS TIME)

(at. http://blog.sqlauthority.com/2009/08/06/sql-server-get-time-in-hourminute-format-from-a-datetime-get-date-part-only-from-datetime/ )

Pessoal, então finalizando este post, agradeço as visitas nestes quatro primeiros meses de blog que têm me animado bastante a continuar escrevendo, principalmente os emails e comentários que tenho recebido.

Até o próximo post!




Sobre o blog

Blog que há três anos trata de SQL Server, .NET Framework, PowerShell, soluções para problemas comuns e não tão comuns assim, informações sobre ferramentas diversas e o que vier na cabeça do MCT Paulo R. Pereira.

Twitter


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 346 outros seguidores

%d bloggers like this: