Вверх ↑
Этот топик читают: Гость
Ответов: 758
Рейтинг: 112
#436: 2010-07-20 18:44:19 ЛС | профиль | цитата
Подскажите, пожалуйста, в каком формате лучше хранить в БД дату и время, что б можно было делать зарос за определенный день, месяц, год
Для меня привычнее так "20.07.2010 18:00"
В справке так "2010-07-20 18:00" или "в виде числа с плавающей точкой"
В HiAsm можно еще много форматов найти
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#437: 2010-07-20 21:30:27 ЛС | профиль | цитата
miver писал(а):
Для меня привычнее так "20.07.2010 18:00"
Привычнее, если оператор вводит дату вручную (возможны ошибки). Если дата выбирается из ComboBox-ов, то намного удобнее выбирать сначала год, потом выбираешь месяц и потом, в зависимости от высокосныйпростой и в зависимости от месяца в ComboBox-е дней создаешь список дней и никогда не получишь 33-е марта
Это относится и к созданию запроса. Запрос нужно тоже делать или на определенный год, или на год.месяц, или на год.месяц.день
А вообще в SQLite для хранения даты доступны
Date and Time Datatype
SQLite нет специального типа для хранения даты иили времени. Date и Time Functions в SQLite читают и пишут дату и время как TEXT, REAL или INTEGER переменные:
TEXT как ISO8601 строку ("YYYY-MM-DD HH:MM:SS.SSS").
REAL как число с плавающей точкой : целая часть - число суток, дробная - часть суток.
INTEGER как Unix Time - число секунд после 1970-01-01 00:00:00 UTC.



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1891
Рейтинг: 110
#438: 2010-07-20 23:03:58 ЛС | профиль | цитата
miver, писал(а):
Для меня привычнее так "20.07.2010 18:00"


Ну-ну, делай, потом только не спрашивай почему запросы за определенный день, месяц и год не работают
------------ Дoбавленo в 23.03:
Начал потихоньку приводить Справку по SQLite в порядок. Разбил справку на отдельные статьи. Кое-какие статьи дополнил. Полностью написал справку по статистическим (aggregate functions) и основным функциям (core functions) в SQLite
карма: 0
%time%
3
Голосовали:Tad, olDjeka, Mandriva
Ответов: 16884
Рейтинг: 1239
#439: 2010-07-21 01:06:42 ЛС | профиль | цитата
Alexbootch, видел я . Удобнее намного. А про
Alexbootch писал(а):
потом только не спрашивай
я уже одному доказывал, не помогло. Ему так удобней, а как удобней SQLite ему пофиг.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1891
Рейтинг: 110
#440: 2010-07-21 01:14:58 ЛС | профиль | цитата
[flood]Tad, а по моему miver и не спрашивает, а сам себе отвечает [/flood]
карма: 0
%time%
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#441: 2010-07-21 01:21:12 ЛС | профиль | цитата
И в чем проблема-то конвертировать на лету один формат данных в другой при записи и чтении
карма: 22

0
Ответов: 758
Рейтинг: 112
#442: 2010-07-21 10:30:47 ЛС | профиль | цитата
Tad писал(а):
Привычнее, если оператор вводит дату вручную (возможны ошибки). Если дата выбирается из ComboBox-ов, то намного удобнее выбирать сначала год, потом выбираешь месяц и потом, в зависимости от высокосныйпростой и в зависимости от месяца в ComboBox-е дней создаешь список дней и никогда не получишь 33-е марта

Полностью согласен. Но даже в DataPicker формат DD.MM.YYYY или HH:MM. И поэтому привычней для пользователя и для меня в частности

Tad писал(а):
•TEXT как ISO8601 строку ("YYYY-MM-DD HH:MM:SS.SSS").
•REAL как число с плавающей точкой : целая часть - число суток, дробная - часть суток.
•INTEGER как Unix Time - число секунд после 1970-01-01 00:00:00 UTC.

Три формата, но так и не стало понятней какой из них лучше для запросов
Или нет разницы для SQLite в каком формате (из этих 3-х) хранить (В плане объема, быстродействия, сложности запросов)

Alexbootch писал(а):
Ну-ну, делай, потом только не спрашивай почему запросы за определенный день, месяц и год не работают

Сарказм иногда хорошо, когда он уместен
Может не правильно поняли "Для меня привычнее так "20.07.2010 18:00"" - означает отображение даты и времени в программе, а не в БД

nesco писал(а):
И в чем проблема-то конвертировать на лету один формат данных в другой при записи и чтении

Проблема не конвертации, а хранения, сортировки, выдаче данных связанных с датой и временем при помощи БД

P.S.: Может где-нибудь есть пример БД с датой и временем. Буду благодарен за ссылку

карма: 1

0
Ответов: 1891
Рейтинг: 110
#443: 2010-07-21 10:37:30 ЛС | профиль | цитата
miver, будь внимательнее, т.к. я это не писал

miver, писал(а):
Alexbootch, писал(а):
Привычнее, если оператор вводит дату вручную (возможны ошибки). Если дата выбирается из ComboBox-ов, то намного удобнее выбирать сначала год, потом выбираешь месяц и потом, в зависимости от высокосныйпростой и в зависимости от месяца в ComboBox-е дней создаешь список дней и никогда не получишь 33-е марта


miver, писал(а):
Сарказм иногда хорошо, когда он уместен


Нет тут никакого сарказма, т.к. в SQLite дата и время хранится в формате "YYYY-MM-DD HH:MM:SS.SSS" и не иначе. Для пользователя же твоей программы дату можно вывести как угодно

miver, писал(а):
P.S.: Может где-нибудь есть пример БД с датой и временем. Буду благодарен за ссылку


Смотри date and time functions, в частности функцию strftime, либо конкретно спрашивай (если не понял), что тебе нужно
карма: 0
%time%
0
Ответов: 758
Рейтинг: 112
#444: 2010-07-21 10:49:11 ЛС | профиль | цитата
Alexbootch писал(а):
Нет тут никакого сарказма, т.к. в SQLite дата и время хранится в формате "YYYY-MM-DD HH:MM:SS.SSS" и не иначе. Для пользователя же твоей программы дату можно вывести как угодно

А какже 3-и формата что Tad описал и дал цитату из справки

Alexbootch писал(а):
Смотри date and time functions , в частности функцию strftime, либо конкретно спрашивай (если не понял), что тебе нужно

Там я уже давно все перечитал. Мне бы живой пример с запросами на, скажем, данные за определенный период времени
карма: 1

0
Ответов: 1891
Рейтинг: 110
#445: 2010-07-21 10:58:41 ЛС | профиль | цитата
miver, писал(а):
А какже 3-и формата что Tad описал и дал цитату из справки


С учетом компонента DateConvertor - этот формат самый подходящий для использования

miver, писал(а):
Tам я уже давно все перечитал. Мне бы живой пример с запросами на, скажем, данные за определенный период времени


Я тебе пример из пальца не высосу. Давай SQL на создание таблицы и вставку данных и конкретно говори, что ты хочешь получить из данной таблицы
карма: 0
%time%
0
Ответов: 758
Рейтинг: 112
#446: 2010-07-21 11:45:52 ЛС | профиль | цитата

Add(MainForm,12092450,224,189)
{
Width=530
Height=277
Position=1
Point(onClose)
link(onCreate,6991059:doOpen,[])
link(onClose,6991059:doClose,[])
}
Add(MTStrTbl,3686310,542,161)
{
@Color=11206570
Top=20
Width=522
Height=223
Align=5
Name="1"
Grid=0
}
Add(DS_SQLite,6991059,266,203)
{
@Color=5636095
Name="11"
FileName="test222.db"
link(onOpen,11629369:doWork,[])
}
Add(DSC_Query,11511635,430,287)
{
@Color=5636095
DSManager="11"
link(onQuery,14717227:doAddRow,[])
link(onColumns,14717227:doAddCols,[])
link(onError,8904597:doWork3,[(581,307)])
}
Add(MST_DB,14717227,479,287)
{
@Color=11206570
MSTControl="1"
}
Add(Message,3808633,598,301)
{
}
Add(DSC_Exec,13846613,542,203)
{
@Color=5636095
SQL="CREATE TABLE tab1( amount INTEGER, dt DATETIME );\r\n\r\nINSERT INTO tab1 VALUES(10, '2010-07-01 10:10');\r\nINSERT INTO tab1 VALUES(20, '2010-08-01 11:15');\r\nINSERT INTO tab1 VALUES(5, '2010-09-01 20:00');\r\nINSERT INTO tab1 VALUES(10, '2010-10-01 10:20');\r\nINSERT INTO tab1 VALUES(20, '2010-11-01 11:30');\r\nINSERT INTO tab1 VALUES(5, '2010-12-01 20:30');\r\n"
DSManager="11"
link(onError,8904597:doWork1,[(581,216)])
}
Add(HubEx,8904597,577,301)
{
link(onEvent,3808633:doMessage,[])
}
Add(Check,11629369,346,203)
{
Caption="Включить при первом запуске"
link(onEvent,13846613:doExec,[])
}
Add(Edit,1109390,353,280)
{
Width=522
Align=2
Text="SELECT sum(amount) AS Количество from tab1 WHERE dt>= '2010-08-01' and dt<= '2010-11-01';"
link(onEnter,11667648:doEvent1,[])
}
Add(Hub,11667648,399,287)
{
link(onEvent1,11511635:doQuery,[])
link(onEvent2,1109390:doText2,[(419,300)(419,318)(341,318)(341,293)])
}


Вот пример, но запрос выдает 35 вместо 55
Как задать запрос, что б видало количество данных введенных в четверг (в независимости от даты)
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#447: 2010-07-21 12:38:03 ЛС | профиль | цитата
nesco писал(а):
И в чем проблема-то конвертировать на лету один формат данных в другой при записи и чтении
а сам пробовал ?
И при организации запросов конвертировать на лету. Сплошные конверторы (и без нижней точки, а у FormatStr точки то сверху. Но это так, к слову.) Ну при записи, если в Real, то ненадо, а при чтении то из Integer ненадо. А так как у нас Real не с 0000-01-01 (а в SQLite да ), то при чтении даты приходится изворачиваться

SELECT datetime(1721424.5+d2)
, что тоже нехорошо.
miver писал(а):
Но даже в DataPicker формат DD.MM.YYYY или HH:MM. И поэтому привычней для пользователя и для меня в частности
Указав в запросе формат вывода
Alexbootch писал(а):
Для пользователя же твоей программы дату можно вывести как угодно

miver писал(а):
Может где-нибудь есть пример БД с датой и временем
Помоему, где-то в начале этой же темы разрабатывалась программа для КИП. Там вычислялись сроки очередных поверок приборов, вывод списка приборов у которых срок заканчвался и т.п. Поищи.

Alexbootch, у меня
Alexbootch писал(а):
Смотри date and time functions
не работает - Готово и... пустая страничка

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#448: 2010-07-21 13:08:16 ЛС | профиль | цитата
Tad писал(а):
Сплошные конверторы (и без нижней точки, а у FormatStr точки то сверху. Но это так, к слову.)

Не понимаю, в чем проблема вот из этого -- DD.MM.YYYY HH:MM:SS.SSS получить вот это YYYY-MM-DD HH:MM:SS.SSS или Real
------------ Дoбавленo в 13.08:
Или я не догнал, или...


Add(MainForm,7786459,266,308)
{
}
Add(Time,12210462,364,203)
{
Point(DateTime)
}
Add(DateConvertor,4559047,371,259)
{
Mode=9
Format="dd.MM.yyyy hh:mm:ss.000"
Point(Data)
link(onResult,5524324:doText,[])
link(Data,12210462:DateTime,[])
}
Add(Edit,5524324,448,259)
{
Left=15
Top=25
Width=210
Text=""
}
Add(Timer,7777439,266,259)
{
link(onTimer,6429160:doEvent1,[])
}
Add(Hub,6429160,322,259)
{
link(onEvent1,4559047:doConvert,[])
link(onEvent2,1593159:doConvert,[(352,272)(352,342)])
}
Add(DateConvertor,487435,504,336)
{
Mode=9
Format="yyyy-MM-dd hh:mm:ss.000"
Point(Data)
link(onResult,13870018:doText,[])
}
Add(Edit,13870018,588,336)
{
Left=15
Top=50
Width=210
Text=""
}
Add(DateConvertor,1593159,448,336)
{
Mode=8
Format="dd.MM.yyyy hh:mm:ss.000"
Point(Data)
link(onResult,487435:doConvert,[])
link(Data,5524324:Text,[])
}
Add(InfoTip,15737684,406,301)
{
Info=#9:Convertor|
Width=162
Height=88
Margin=10
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#449: 2010-07-21 13:55:23 ЛС | профиль | цитата
miver писал(а):
Вот пример, но запрос выдает 35 вместо 55


Add(Edit,1109390,311,245)
{
Width=522
Align=2
Text="SELECT sum(amount) AS Количество from tab1 WHERE substr(dt,1,10)>= '2010-08-01' and substr(dt,1,10)<= '2010-11-01';"
}
Твоя ошибка в том, что ты в базу пишешь со временем, а запрос делаешь только по дате. Отделяем мух от котлет.
------------ Дoбавленo в 13.33:
nesco писал(а):
Или я не догнал, или...
во первых минуты на месяцы замени в формате "mm на MM"(пример: лишний компонент - генератор ошибок), а во вторых можно сделать всё, что хочется. Я говорю о применении стандартных функций SQLite, которые не всегда совпадают с HiAsm-овскими. Например,
1. шаблоны форматов даты времени
2. DateReal - писал выше. Кто не знает о хитром числе 1721424.5, рискует получить от

Select date(имя колонки с DateReal)
-2003-07-21 и будет ходить вокруг да около этого резултата с минусом.
------------ Дoбавленo в 13.55:
nesco писал(а):
Не понимаю, в чем проблема вот из этого -- DD.MM.YYYY HH:MM:SS.SSS получить вот это YYYY-MM-DD HH:MM:SS.SSS
Никакой проблемы (у меня во всяком случае) нет. При записи в БД пишу в REAL. При чтении из БД - читаю в REAL и подаю результат на
DatePicker.doSetDate и у оператора на экране
miver писал(а):
"Для меня привычнее так "20.07.2010 18:00""
. Заметь без никаких конверторов.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#450: 2010-07-21 13:59:22 ЛС | профиль | цитата
Tad писал(а):
во первых минуты на месяцы замени в формате "mm на MM"

Да, ошибся
Tad писал(а):
Я говорю о применении стандартных функций SQLite, которые не всегда совпадают с HiAsm-овскими

А я говорю об использовании любых ресурсов для достижения поставленной задачи.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)