Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Друзья, подскажите пожалуйста.

Есть таблица в которой есть поле data и поле time
поле data - DATE
поле time - СHAR

Мне необходимо сделать выборку по дате+время
Сейчас я делаю так
1 сначала выборка в промежуточную таблицу select_data по дате, одновременно объединяю поля t0.data+t0.time AS date_time,
2 Создаю в таблице select_data поле datetime - DATETIME
3 Перебираю строки и заношу в поле datetime значение поля date_time. (PHP)
4 После этого делаю выборку из таблицы select_data по дате+время - получаю результат

И сдается мне что это крайне кривое решение. Но изящнее у меня не получается.
(с таблицей сделать ничего нельзя и данные в ней так и будут храниться)
17 янв 14, 15:02    [15430562]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
Glory
Member

Откуда:
Сообщений: 104751
ELEKTpoHuK
поле time - СHAR

В каком формате ?
И какая версия MSSQL ?
17 янв 14, 15:17    [15430702]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Поле time имеет тип Char а записано время в виде 12:34
17 янв 14, 15:33    [15430826]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Версию смогу по позже сказать. Но относительно новая.
17 янв 14, 15:35    [15430844]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
Glory
Member

Откуда:
Сообщений: 104751
ELEKTpoHuK
Версию смогу по позже сказать. Но относительно новая.

Тогда вам надо изучить синтаксис функции CAST/CONVERT и сделать все в одном запросе
17 янв 14, 15:40    [15430876]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Я сделал несколько попыток но мне это не дало никакого результата. Продолжаю эксперименты, но если кто-то поможет буду только рад.
17 янв 14, 15:49    [15430953]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
Glory
Member

Откуда:
Сообщений: 104751
ELEKTpoHuK
Я сделал несколько попыток но мне это не дало никакого результата.

И где эти попытки ?
17 янв 14, 15:56    [15430995]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ELEKTpoHuK,

DECLARE @D DATE='20140115', @T CHAR(5)='05:11';
SELECT CAST(CAST(@D AS CHAR(10))+'T'+@T+':00' AS DATETIME);
17 янв 14, 16:01    [15431037]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Я доберусь до компа и наишу что мной было опробовано.
17 янв 14, 16:09    [15431080]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Вот такая у меня штука (лишнее убрал) Так я пробую сделать но ничего не выходит. При этом dateen_timeen_cast отображается как Jan 15 2014 04:55:00:000PM
$zapros_create_view = mssql_query("
CREATE VIEW dbo.____view_big_select 
AS
SELECT 
t0.dateen,
t0.timeen,
CAST(t0.dateen + t0.timeen AS DATETIME) AS dateen_timeen_cast,
t0.dateen+t0.timeen AS dateen_timeen_plus,
t0.NTIR
FROM svh.dbo.prop t0
") or die('mssql_connect error view: '.mssql_get_last_message());

$zapros_select_ = mssql_query("	
SELECT *
FROM svh.dbo.____view_big_select t0
WHERE
(t0.dateen_timeen_cast between '2014-01-01 00:00:00' and '2014-01-31 23:59:00') 
") or die('mssql_connect error3: '.mssql_get_last_message());	
18 янв 14, 03:29    [15432961]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
iap
ELEKTpoHuK,

DECLARE @D DATE='20140115', @T CHAR(5)='05:11';
SELECT CAST(CAST(@D AS CHAR(10))+'T'+@T+':00' AS DATETIME);


Спасибо, пытаюсь прикрутить к себе, пока не вышло.
пробовал и так
CAST(CAST(t0.dateen AS CHAR(10)) + t0.timeen AS DATETIME) AS dateen_timeen_cast,
18 янв 14, 03:33    [15432969]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ELEKTpoHuK
iap
ELEKTpoHuK,

DECLARE @D DATE='20140115', @T CHAR(5)='05:11';
SELECT CAST(CAST(@D AS CHAR(10))+'T'+@T+':00' AS DATETIME);



Спасибо, пытаюсь прикрутить к себе, пока не вышло.
пробовал и так
CAST(CAST(t0.dateen AS CHAR(10)) + t0.timeen AS DATETIME) AS dateen_timeen_cast,
Вы не умеете читать?
И в документацию по функциям CAST и CONVERT не полезете?
Там рядом про строковые представления даты-времени написано
18 янв 14, 09:52    [15433182]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
iap
Вы не умеете читать?
И в документацию по функциям CAST и CONVERT не полезете?
Там рядом про строковые представления даты-времени написано


Напротив, я умею читать. И документацию иду в первую очередь. Сюда стараюсь писать если совсем пропадают варианты. Как и в этом случае. Я попробовал сам решить но у меня не получилось. Поэтому сюда и обратился. Ваш вариант видимо сработает, просто дата у меня в формате Jan 3 2014 12:00:00:000PM Я это сразу не написал. Сейчас постараюсь все перевести в нужный формат и применить Ваш CAST.
20 янв 14, 10:44    [15439063]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
Glory
Member

Откуда:
Сообщений: 104751
ELEKTpoHuK
просто дата у меня в формате Jan 3 2014 12:00:00:000PM Я это сразу не написал.

Формат _отображения_ типа данных date(time) не имеет никакого значения

ELEKTpoHuK
Напротив, я умею читать. И документацию иду в первую очередь.Сюда стараюсь писать если совсем пропадают варианты. Как и в этом случае.

И откуда другним станет известно, что вы читатли, что вы пробовали и что получили ?
20 янв 14, 10:48    [15439081]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Glory
Формат _отображения_ типа данных date(time) не имеет никакого значения

Видимо имеет.
При таком Select
SELECT CAST(CAST(t0.dateen AS CHAR(10)) AS dateen_cast

dateen_cast получается вида Jan 1 201


Glory
И откуда другним станет известно, что вы читатли, что вы пробовали и что получили ?

И чего вы такие агрессивные? Будьте снисходительнее мастера. Я же за помощью обращаюсь, прошу указать направление для движения.
Сейчас я его получил - думаю, что вот-вот получится. Напишу о результатах.
20 янв 14, 11:16    [15439222]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
Glory
Member

Откуда:
Сообщений: 104751
ELEKTpoHuK
Видимо имеет.
При таком Select
SELECT CAST(CAST(t0.dateen AS CHAR(10)) AS dateen_cast


dateen_cast получается вида Jan 1 201

Какое отношение CHAR(10) имеет к datetime ?
Вы понимаете различия между типами данных ?

ELEKTpoHuK
И чего вы такие агрессивные? Будьте снисходительнее мастера. Я же за помощью обращаюсь, прошу указать направление для движения.

Сколько времени вы забрали на выяснения подробностей ?
20 янв 14, 11:20    [15439250]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ELEKTpoHuK,

--- короче нужно просто явно указать формат даты чтобы не зависеть от т.н. локации.
-- т.е 127 - это и есть явное указание формата даты
convert(datetime, convert(varchar(10), t.DateEN, 127)+'T'+t.TimeEN+':00.000', 127)
20 янв 14, 11:21    [15439252]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Jaffar
ELEKTpoHuK,

--- короче нужно просто явно указать формат даты чтобы не зависеть от т.н. локации.
-- т.е 127 - это и есть явное указание формата даты
convert(datetime, convert(varchar(10), t.DateEN, 127)+'T'+t.TimeEN+':00.000', 127)


Это рабочий вариант!
Я по предыдущим наводкам сделал так

CAST(CAST(cast(t0.dateen as datetimeoffset) AS CHAR(10)) +'T'+ t0.timeen +':00' AS DATETIME) AS dateen_timeen_cast,

Это тоже рабочий вариант.
Получилась такая вьюха
CREATE VIEW dbo.____view_big_select 
AS
SELECT 
t0.NCAR, 
t0.dateen,
CAST(CAST(cast(t0.dateen as datetimeoffset) AS CHAR(10)) +'T'+ t0.timeen +':00' AS DATETIME) AS dateen_timeen_cast,
convert(datetime, convert(varchar(10), t0.DateEN, 127)+'T'+t0.TimeEN+':00.000', 127) AS dateen_timeen_cast_2,
t0.NTIR
FROM svh.dbo.prop_ent t0


Но при дальнейшей работе с ней возникают сложности. Я пытаюсь из нее сделать выборку как раз на интервал со временем.
SELECT *
FROM svh.dbo.____view_big_select t0
WHERE
(t0.dateen_timeen_cast between '2014-01-01 00:00:00' and '2014-01-31 23:59:00') 


И в этом случае оба варианты выдают пустой результат, тогда как если записать выборку по полю t0.dateen:
SELECT *
FROM svh.dbo.____view_big_select t0
WHERE
(t0.dateen between '2014-01-01 00:00:00' and '2014-01-31 23:59:00') 

выборка только по дате срабатывает верно.
20 янв 14, 11:38    [15439362]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Но выборка по дате и времени не работает. Натолкните на мысль.
20 янв 14, 12:37    [15439959]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ELEKTpoHuK
Jaffar
ELEKTpoHuK,

--- короче нужно просто явно указать формат даты чтобы не зависеть от т.н. локации.
-- т.е 127 - это и есть явное указание формата даты
convert(datetime, convert(varchar(10), t.DateEN, 127)+'T'+t.TimeEN+':00.000', 127)



Это рабочий вариант!
Я по предыдущим наводкам сделал так

CAST(CAST(cast(t0.dateen as datetimeoffset) AS CHAR(10)) +'T'+ t0.timeen +':00' AS DATETIME) AS dateen_timeen_cast,


Это тоже рабочий вариант.
Получилась такая вьюха
CREATE VIEW dbo.____view_big_select 
AS
SELECT 
t0.NCAR, 
t0.dateen,
CAST(CAST(cast(t0.dateen as datetimeoffset) AS CHAR(10)) +'T'+ t0.timeen +':00' AS DATETIME) AS dateen_timeen_cast,
convert(datetime, convert(varchar(10), t0.DateEN, 127)+'T'+t0.TimeEN+':00.000', 127) AS dateen_timeen_cast_2,
t0.NTIR
FROM svh.dbo.prop_ent t0



Но при дальнейшей работе с ней возникают сложности. Я пытаюсь из нее сделать выборку как раз на интервал со временем.
SELECT *
FROM svh.dbo.____view_big_select t0
WHERE
(t0.dateen_timeen_cast between '2014-01-01 00:00:00' and '2014-01-31 23:59:00') 



И в этом случае оба варианты выдают пустой результат, тогда как если записать выборку по полю t0.dateen:
SELECT *
FROM svh.dbo.____view_big_select t0
WHERE
(t0.dateen between '2014-01-01 00:00:00' and '2014-01-31 23:59:00') 


выборка только по дате срабатывает верно.
Формат YYYY-MM-DD для типа данных DATETIME зависит от SET DATEFORMAT или SET LANGUAGE.
Ибо неясно, где там в строке MM, а где DD.
Можно написать и так, но в функции CONVERT() с соответствующим третьим параметром.

Если же написать точно так же, но приписать ещё справа время hh:mm:ss.nnn,
отделив его от даты заглавной буквой T, то получится стандартный формат ISO-8601,
который сервер однозначно распознаёт при неявном преобразовании
без каких-либо функций. В CONVERT() это соответствует стилю 126.
http://msdn.microsoft.com/ru-ru/library/ms187928(v=sql.100).aspx

http://msdn.microsoft.com/ru-ru/library/ms180878(v=sql.100).aspx
20 янв 14, 13:04    [15440151]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
iap
Формат YYYY-MM-DD для типа данных DATETIME зависит от SET DATEFORMAT или SET LANGUAGE.
Ибо неясно, где там в строке MM, а где DD.
Можно написать и так, но в функции CONVERT() с соответствующим третьим параметром.

Если же написать точно так же, но приписать ещё справа время hh:mm:ss.nnn,
отделив его от даты заглавной буквой T, то получится стандартный формат ISO-8601,
который сервер однозначно распознаёт при неявном преобразовании
без каких-либо функций. В CONVERT() это соответствует стилю 126.
http://msdn.microsoft.com/ru-ru/library/ms187928(v=sql.100).aspx

http://msdn.microsoft.com/ru-ru/library/ms180878(v=sql.100).aspx


Я написал, что мне удалось благодаря вашей наводке записать в новую колонку дату со временем
CAST(CAST(cast(t0.dateen as datetimeoffset) AS CHAR(10)) +'T'+ t0.timeen +':00' AS DATETIME) AS dateen_timeen_cast,


Дальше, когда я делаю selet из вьюхи, колонка dateen_timeen_cast отображается в виде Jan 15 2014 04:55:00:000PM, но выборка по этой колонке не работает. Я что-то не замечаю?
20 янв 14, 13:12    [15440205]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ELEKTpoHuK
iap
Формат YYYY-MM-DD для типа данных DATETIME зависит от SET DATEFORMAT или SET LANGUAGE.
Ибо неясно, где там в строке MM, а где DD.
Можно написать и так, но в функции CONVERT() с соответствующим третьим параметром.

Если же написать точно так же, но приписать ещё справа время hh:mm:ss.nnn,
отделив его от даты заглавной буквой T, то получится стандартный формат ISO-8601,
который сервер однозначно распознаёт при неявном преобразовании
без каких-либо функций. В CONVERT() это соответствует стилю 126.
http://msdn.microsoft.com/ru-ru/library/ms187928(v=sql.100).aspx

http://msdn.microsoft.com/ru-ru/library/ms180878(v=sql.100).aspx


Я написал, что мне удалось благодаря вашей наводке записать в новую колонку дату со временем
CAST(CAST(cast(t0.dateen as datetimeoffset) AS CHAR(10)) +'T'+ t0.timeen +':00' AS DATETIME) AS dateen_timeen_cast,



Дальше, когда я делаю selet из вьюхи, колонка dateen_timeen_cast отображается в виде Jan 15 2014 04:55:00:000PM, но выборка по этой колонке не работает. Я что-то не замечаю?
Отображается где?
Понимаете разницу между типом DATETIME и строковым представлением даты?
Если клиент настроен изображать полученную дату в виде строки 'Jan 15 2014 04:55:00:000PM', то при чём здесь сервер?
Если надо выводить строку в другом виде, то клиенты обычно умеют это делать.
Сервер может слегка их подменить функцией CONVERT() - см. ссылку, которую я давал.

Что такое "выборка по этой колонке"?
20 янв 14, 13:17    [15440239]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
iap
Отображается где?
Понимаете разницу между типом DATETIME и строковым представлением даты?
Если клиент настроен изображать полученную дату в виде строки 'Jan 15 2014 04:55:00:000PM', то при чём здесь сервер?
Если надо выводить строку в другом виде, то клиенты обычно умеют это делать.
Сервер может слегка их подменить функцией CONVERT() - см. ссылку, которую я давал.

Что такое "выборка по этой колонке"?

Да, понимаю. И сервер тут не причем. Я делаю вьюху, где в поле dateen_timeen_cast пишу (поля дата + время) в виде 2014-01-15T10:10:20
Она туда прекрасно записывается, что видно из того, что она отображается в виде 'Jan 15 2014 10:10:20:000PM' то есть в соответствии с представлением даты сервером. К этому никаких вопросов не имею.

Но я по этой колонке не могу сделать выборку
WHERE
(t0.dateen_timeen_cast between '2014-01-01 00:00:00' and '2014-01-31 23:59:00')
не работает.
20 янв 14, 13:25    [15440284]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ELEKTpoHuK
iap
Отображается где?
Понимаете разницу между типом DATETIME и строковым представлением даты?
Если клиент настроен изображать полученную дату в виде строки 'Jan 15 2014 04:55:00:000PM', то при чём здесь сервер?
Если надо выводить строку в другом виде, то клиенты обычно умеют это делать.
Сервер может слегка их подменить функцией CONVERT() - см. ссылку, которую я давал.

Что такое "выборка по этой колонке"?

Да, понимаю. И сервер тут не причем. Я делаю вьюху, где в поле dateen_timeen_cast пишу (поля дата + время) в виде 2014-01-15T10:10:20
Она туда прекрасно записывается, что видно из того, что она отображается в виде 'Jan 15 2014 10:10:20:000PM' то есть в соответствии с представлением даты сервером. К этому никаких вопросов не имею.

Но я по этой колонке не могу сделать выборку
WHERE
(t0.dateen_timeen_cast between '2014-01-01 00:00:00' and '2014-01-31 23:59:00')
не работает.
t0.dateen_timeen_cast >='2014' and t0.dateen_timeen_cast <'20140201'
20 янв 14, 13:28    [15440308]     Ответить | Цитировать Сообщить модератору
 Re: Select по дата+время из полей с типами DATE и CHAR  [new]
ELEKTpoHuK
Member

Откуда:
Сообщений: 56
Возможно. что он эту строку считает как CHAR? Может быть нужно попробовать при select сделать convert/cast. Попробую.
20 янв 14, 13:29    [15440313]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить