Para os usuários finais , não é incomum para solicitar uma comparação de dois pontos do tempo em SQL Oracle. O processo pode tornar-se complexa quando a necessidade de comparar o valor de vários intervalos de datas com SQL Oracle. Existem vários métodos para comparar intervalos de datas no Oracle com cada um tendo um impacto diferente sobre o desempenho do banco de dados . Há uma quantidade significativa de tempo de execução para converter e testar cada data na tabela linha multimilionário . Isto terá sub- segundo tempo de resposta. Métodos de comparação Data normalmente fazem parte da arquitetura do Oracle SQL discussões , a fim de garantir a estrutura de memória do banco de dados é mais otimizado para as consultas esperados sobre os dados. Instruções Use o comando " TO_CHAR " explicitamente com seu próprio formato de data. Por exemplo , selecione TO_CHAR (b, 'AAAA /MM /DD ') . A utilização geral do comando " TO_CHAR " é: " ( , ' ')" onde a seqüência de formato é uma opção que pode ser formado de 40 maneiras. Algumas das opções mais comuns utilizados são: mês MM numérico (por exemplo, 09) MON Nome do mês abreviado (por exemplo , a SEP ) MÊS Nome completo do mês (por exemplo , maio) Dia DD do mês (por exemplo , 08) DY nome abreviado do dia (por exemplo, SAT) HH Hora do dia (1-12) HH24 Hora do dia ( 0-23 ) Minuto MI ( 0-59 ) SS Segundo ( 0-59 ) Selecione o modificador de matemática para usar na consulta. As opções disponíveis para usar são: . SUM, MINUS e GROUP Escolha a operação de consulta SQL para realizar entre as opções disponíveis de conjuntos de modificadores e de dados. Um exemplo de soma de vendas de uma empresa ao longo de um período de tempo é : sum ( jun2004.sales ) - sum ( jun2005.sales ) fromtransaction_table jun2004 , transaction_table jun2005wherejun2004.trans_year = 2004andjun2004.trans_month = 6andjun2004.trans_year = 2005andjun2004.trans_month = 6; < br > Optest a consulta para o tempo ea eficiência dos recursos , executando a consulta. Se o tempo de resposta atenda às suas necessidades , implementar a consulta no banco de dados de produção por salvá-lo em disco. Según lo sugerido por algunos, al usar DATE(timestamp) está aplicando la manipulación a la columna y, por lo tanto, no puede confiar en el orden del índice. Sin embargo, usar BETWEEN solo sería confiable si incluyes los milisegundos. En el ejemplo de marca de tiempo BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59' excluye registros con una marca de tiempo entre 2012-05-05 23:59:59.001 y 2012-05-05 23:59:59.999. Sin embargo, incluso este método tiene algunos problemas, debido a la precisión de los tipos de datos. Ocasionalmente se redondean 999 milisegundos. Lo mejor que puedes hacer es: SELECT * FROM table WHERE date>='2012-05-05' AND date<'2012-05-06'
O BigQuery é compatível com as funções DATETIME a seguir. Todas as saídas são formatadas automaticamente de acordo com o ISO 8601, separando a data e a hora com um T. CURRENT_DATETIME([time_zone])Descrição Retorna o horário atual como um objeto DATETIME. Os parênteses são opcionais quando chamados sem argumentos. Esta função aceita um parâmetro time_zone opcional. Para informações sobre como especificar um fuso horário, consulte Definições de fuso horário. Tipo de dados retornados DATETIME Exemplo SELECT CURRENT_DATETIME() as now; +----------------------------+ | now | +----------------------------+ | 2016-05-19T10:38:47.046465 | +----------------------------+Quando uma coluna chamada current_datetime está presente, o nome da coluna e a chamada de função sem parênteses são ambíguos. Para garantir a chamada da função, adicione parênteses. Para garantir o nome da coluna, qualifique-o com a variável de intervalo dele. Por exemplo, a consulta a seguir selecionará a função na coluna now e a coluna da tabela na coluna current_datetime. WITH t AS (SELECT 'column value' AS `current_datetime`) SELECT current_datetime() as now, t.current_datetime FROM t; +----------------------------+------------------+ | now | current_datetime | +----------------------------+------------------+ | 2016-05-19T10:38:47.046465 | column value | +----------------------------+------------------+ 1. DATETIME(year, month, day, hour, minute, second) 2. DATETIME(date_expression[, time_expression]) 3. DATETIME(timestamp_expression [, time_zone])Descrição
Tipo de dados retornados DATETIME Exemplo SELECT DATETIME(2008, 12, 25, 05, 30, 00) as datetime_ymdhms, DATETIME(TIMESTAMP "2008-12-25 05:30:00+00", "America/Los_Angeles") as datetime_tstz; +---------------------+---------------------+ | datetime_ymdhms | datetime_tstz | +---------------------+---------------------+ | 2008-12-25T05:30:00 | 2008-12-24T21:30:00 | +---------------------+---------------------+ EXTRACT(part FROM datetime_expression)Descrição Retorna um valor que corresponde ao part especificado de um datetime_expression fornecido. Os valores part permitidos são:
Os valores retornados truncam períodos menores de tempo. Por exemplo, ao extrair segundos, EXTRACT trunca os valores de milissegundos e microssegundos. Tipo de dados retornados INT64, exceto nos seguintes casos:
Exemplos No exemplo a seguir, EXTRACT retorna um valor correspondente à parte de hora de HOUR. SELECT EXTRACT(HOUR FROM DATETIME(2008, 12, 25, 15, 30, 00)) as hour; +------------------+ | hour | +------------------+ | 15 | +------------------+No exemplo a seguir, EXTRACT retorna valores correspondentes a diferentes partes da hora de uma coluna de datas e horas. WITH Datetimes AS ( SELECT DATETIME '2005-01-03 12:34:56' AS datetime UNION ALL SELECT DATETIME '2007-12-31' UNION ALL SELECT DATETIME '2009-01-01' UNION ALL SELECT DATETIME '2009-12-31' UNION ALL SELECT DATETIME '2017-01-02' UNION ALL SELECT DATETIME '2017-05-26' ) SELECT datetime, EXTRACT(ISOYEAR FROM datetime) AS isoyear, EXTRACT(ISOWEEK FROM datetime) AS isoweek, EXTRACT(YEAR FROM datetime) AS year, EXTRACT(WEEK FROM datetime) AS week FROM Datetimes ORDER BY datetime; +---------------------+---------+---------+------+------+ | datetime | isoyear | isoweek | year | week | +---------------------+---------+---------+------+------+ | 2005-01-03T12:34:56 | 2005 | 1 | 2005 | 1 | | 2007-12-31T00:00:00 | 2008 | 1 | 2007 | 52 | | 2009-01-01T00:00:00 | 2009 | 1 | 2009 | 0 | | 2009-12-31T00:00:00 | 2009 | 53 | 2009 | 52 | | 2017-01-02T00:00:00 | 2017 | 1 | 2017 | 1 | | 2017-05-26T00:00:00 | 2017 | 21 | 2017 | 21 | +---------------------+---------+---------+------+------+No exemplo a seguir, datetime_expression cai em um domingo. EXTRACT calcula a primeira coluna usando semanas que começam no domingo e calcula a segunda coluna usando semanas que começam na segunda-feira. Descrição Adiciona unidades int64_expression de part ao objeto DATETIME. DATETIME_ADD aceita os seguintes valores para part:
Será necessário um tratamento especial para as partes MONTH, QUARTER e YEAR quando a data for o último dia do mês ou estiver perto dele. Se o mês resultante tiver menos dias do que DATETIME original, então o dia resultante será o último dia do novo mês. Tipo de dados retornados DATETIME Exemplo SELECT DATETIME "2008-12-25 15:30:00" as original_date, DATETIME_ADD(DATETIME "2008-12-25 15:30:00", INTERVAL 10 MINUTE) as later; +-----------------------------+------------------------+ | original_date | later | +-----------------------------+------------------------+ | 2008-12-25T15:30:00 | 2008-12-25T15:40:00 | +-----------------------------+------------------------+ DATETIME_SUB(datetime_expression, INTERVAL int64_expression part)Descrição Subtrai unidades int64_expression de part do DATETIME. DATETIME_SUB aceita os seguintes valores para part:
Será necessário um tratamento especial para as partes MONTH, QUARTER e YEAR quando a data for o último dia do mês ou estiver perto dele. Se o mês resultante tiver menos dias do que o DATETIME original, o dia resultante será o último dia do novo mês. Tipo de dados retornados DATETIME Exemplo SELECT DATETIME "2008-12-25 15:30:00" as original_date, DATETIME_SUB(DATETIME "2008-12-25 15:30:00", INTERVAL 10 MINUTE) as earlier; +-----------------------------+------------------------+ | original_date | earlier | +-----------------------------+------------------------+ | 2008-12-25T15:30:00 | 2008-12-25T15:20:00 | +-----------------------------+------------------------+ DATETIME_DIFF(datetime_expression_a, datetime_expression_b, part)Descrição Retorna o número de intervalos part inteiros especificados entre dois objetos DATETIME (datetime_expression_a - datetime_expression_b). Se o primeiro DATETIME for anterior ao segundo, a saída será negativa. Lança um erro se o cálculo estoura o tipo de resultado, como se a diferença em microssegundos entre os dois objetos DATETIME estourasse um valor INT64. DATETIME_DIFF aceita os seguintes valores para part:
Tipo de dados retornados INT64 Exemplo SELECT DATETIME "2010-07-07 10:20:00" as first_datetime, DATETIME "2008-12-25 15:30:00" as second_datetime, DATETIME_DIFF(DATETIME "2010-07-07 10:20:00", DATETIME "2008-12-25 15:30:00", DAY) as difference; +----------------------------+------------------------+------------------------+ | first_datetime | second_datetime | difference | +----------------------------+------------------------+------------------------+ | 2010-07-07T10:20:00 | 2008-12-25T15:30:00 | 559 | +----------------------------+------------------------+------------------------+ SELECT DATETIME_DIFF(DATETIME '2017-10-15 00:00:00', DATETIME '2017-10-14 00:00:00', DAY) as days_diff, DATETIME_DIFF(DATETIME '2017-10-15 00:00:00', DATETIME '2017-10-14 00:00:00', WEEK) as weeks_diff; +-----------+------------+ | days_diff | weeks_diff | +-----------+------------+ | 1 | 1 | +-----------+------------+O exemplo acima mostra o resultado de DATETIME_DIFF para dois DATETIMEs que estão separados por 24 horas. DATETIME_DIFF com a parte WEEK retorna 1 porque DATETIME_DIFF conta o número de limites das partes nesse intervalo de DATETIMEs. Cada WEEK começa no domingo, então há um limite de parte entre sábado, 2017-10-14 00:00:00 e domingo, 2017-10-15 00:00:00. No exemplo a seguir, mostraremos o resultado de DATETIME_DIFF para duas datas em anos diferentes. DATETIME_DIFF com a parte da data YEAR retorna 3 porque conta o número de limites do ano do calendário gregoriano entre as duas DATETIMEs. DATETIME_DIFF com a parte da data ISOYEAR retorna 2 porque a segunda DATETIME pertence ao ano ISO 2015. A primeira quinta-feira do ano calendário de 2015 foi 2015-01-01, então o ano ISO 2015 começa na segunda-feira anterior, 2014-12-29. SELECT DATETIME_DIFF('2017-12-30 00:00:00', '2014-12-30 00:00:00', YEAR) AS year_diff, DATETIME_DIFF('2017-12-30 00:00:00', '2014-12-30 00:00:00', ISOYEAR) AS isoyear_diff; +-----------+--------------+ | year_diff | isoyear_diff | +-----------+--------------+ | 3 | 2 | +-----------+--------------+O exemplo a seguir mostra o resultado de DATETIME_DIFF para dois dias consecutivos. A primeira data cai em uma segunda-feira e a segunda data cai em um domingo. DATETIME_DIFF com a parte da data WEEK retorna 0 porque esta parte do tempo usa semanas que começam no domingo. DATETIME_DIFF com a parte da data WEEK(MONDAY) retorna 1. DATETIME_DIFF com a parte da data ISOWEEK também retorna 1 porque as semanas ISO começam na segunda-feira. SELECT DATETIME_DIFF('2017-12-18', '2017-12-17', WEEK) AS week_diff, DATETIME_DIFF('2017-12-18', '2017-12-17', WEEK(MONDAY)) AS week_weekday_diff, DATETIME_DIFF('2017-12-18', '2017-12-17', ISOWEEK) AS isoweek_diff; +-----------+-------------------+--------------+ | week_diff | week_weekday_diff | isoweek_diff | +-----------+-------------------+--------------+ | 0 | 1 | 1 | +-----------+-------------------+--------------+ DATETIME_TRUNC(datetime_expression, part)Descrição Trunca um objeto DATETIME para a granularidade de part. DATETIME_TRUNC aceita os seguintes valores para part:
Tipo de dados retornados DATETIME Exemplos SELECT DATETIME "2008-12-25 15:30:00" as original, DATETIME_TRUNC(DATETIME "2008-12-25 15:30:00", DAY) as truncated; +----------------------------+------------------------+ | original | truncated | +----------------------------+------------------------+ | 2008-12-25T15:30:00 | 2008-12-25T00:00:00 | +----------------------------+------------------------+No exemplo a seguir, o DATETIME original cai em um domingo. Como part é WEEK(MONDAY), DATE_TRUNC retorna o DATETIME da segunda-feira anterior. SELECT datetime AS original, DATETIME_TRUNC(datetime, WEEK(MONDAY)) AS truncated FROM (SELECT DATETIME(TIMESTAMP "2017-11-05 00:00:00+00", "UTC") AS datetime); +---------------------+---------------------+ | original | truncated | +---------------------+---------------------+ | 2017-11-05T00:00:00 | 2017-10-30T00:00:00 | +---------------------+---------------------+No exemplo a seguir, o datetime_expression original está no ano letivo gregoriano de 2015. No entanto, DATETIME_TRUNC com a parte da data ISOYEAR trunca a datetime_expression no início do ano ISO, não no ano do calendário gregoriano. A primeira quinta-feira do ano-calendário de 2015 foi 2015-01-01, então o ano ISO 2015 começa na segunda-feira anterior, 2014-12-29. Portanto, o limite do ano ISO anterior a datetime_expression 2015-06-15 00:00:00 é 2014-12-29. SELECT DATETIME_TRUNC('2015-06-15 00:00:00', ISOYEAR) AS isoyear_boundary, EXTRACT(ISOYEAR FROM DATETIME '2015-06-15 00:00:00') AS isoyear_number; +---------------------+----------------+ | isoyear_boundary | isoyear_number | +---------------------+----------------+ | 2014-12-29T00:00:00 | 2015 | +---------------------+----------------+ FORMAT_DATETIME(format_string, datetime_expression)Descrição Formata um objeto DATETIME de acordo com o format_string especificado. Consulte Elementos de formatos compatíveis de DATETIME para ver uma lista de elementos de formato aceitos por essa função. Tipo de dados retornados STRING Exemplos LAST_DAYLAST_DAY(datetime_expression[, date_part])Descrição Retorna o último dia de uma expressão do tipo datetime que contém a data. Ele é normalmente usado para retornar o último dia do mês. Também é possível especificar a parte da data para a qual o último dia é retornado. Se este parâmetro não for usado, o valor padrão será MONTH. LAST_DAY aceita os seguintes valores para date_part:
Tipo de dados retornados DATE Exemplo Ambos retornam o último dia do mês: SELECT LAST_DAY(DATETIME '2008-11-25', MONTH) AS last_day +------------+ | last_day | +------------+ | 2008-11-30 | +------------+ SELECT LAST_DAY(DATETIME '2008-11-25') AS last_day +------------+ | last_day | +------------+ | 2008-11-30 | +------------+Retorna o último dia do ano: SELECT LAST_DAY(DATETIME '2008-11-25 15:30:00', YEAR) AS last_day +------------+ | last_day | +------------+ | 2008-12-31 | +------------+Retorna o último dia da semana de uma semana que começa no domingo: SELECT LAST_DAY(DATETIME '2008-11-10 15:30:00', WEEK(SUNDAY)) AS last_day +------------+ | last_day | +------------+ | 2008-11-15 | +------------+Retorna o último dia da semana de uma semana que começa na segunda-feira: SELECT LAST_DAY(DATETIME '2008-11-10 15:30:00', WEEK(MONDAY)) AS last_day +------------+ | last_day | +------------+ | 2008-11-16 | +------------+ PARSE_DATETIME(format_string, datetime_string)Descrição Converte uma representação de string de um datetime em um objeto DATETIME. format_string contém os elementos de formato que definem como datetime_string é formatado. Cada elemento em datetime_string precisa ter um elemento correspondente em format_string. O local de cada elemento em format_string precisa corresponder à localização de cada elemento em datetime_string. -- This works because elements on both sides match. SELECT PARSE_DATETIME("%a %b %e %I:%M:%S %Y", "Thu Dec 25 07:30:00 2008") -- This doesn't work because the year element is in different locations. SELECT PARSE_DATETIME("%a %b %e %Y %I:%M:%S", "Thu Dec 25 07:30:00 2008") -- This doesn't work because one of the year elements is missing. SELECT PARSE_DATETIME("%a %b %e %I:%M:%S", "Thu Dec 25 07:30:00 2008") -- This works because %c can find all matching elements in datetime_string. SELECT PARSE_DATETIME("%c", "Thu Dec 25 07:30:00 2008")A string de formato é totalmente compatível com a maioria dos elementos de formato, exceto %a, %A, %g, %G, %j, %P, %u, %U, %V, %w e %W. PARSE_DATETIME analisa string de acordo com as seguintes regras:
Tipo de dados retornados DATETIME Exemplos Nos exemplos a seguir, analisamos um literal STRING como DATETIME. SELECT PARSE_DATETIME('%Y-%m-%d %H:%M:%S', '1998-10-18 13:45:55') AS datetime; +---------------------+ | datetime | +---------------------+ | 1998-10-18T13:45:55 | +---------------------+ SELECT PARSE_DATETIME('%m/%d/%Y %I:%M:%S %p', '8/30/2018 2:23:38 pm') AS datetime +---------------------+ | datetime | +---------------------+ | 2018-08-30T14:23:38 | +---------------------+O exemplo a seguir analisa um literal STRING que contém uma data em um formato de linguagem natural como DATETIME. SELECT PARSE_DATETIME('%A, %B %e, %Y','Wednesday, December 19, 2018') AS datetime; +---------------------+ | datetime | +---------------------+ | 2018-12-19T00:00:00 | +---------------------+ |