Я изучаю SQLite для работы, и я пытаюсь вычесть столбец «Конечная дата» из столбца «Дата начала», который содержит дату и время. Что-то вроде этого:
Startdate 3/15/18 16:00 3/28/18 17:00
Enddate 3/19/18 00:00 3/20/18 00:00
Имя моей таблицы - data1. Я пробовал это:
select *,
strftime('%m/%d/%y %H:%M', 'data1.Enddate') -
(strftime('%m/%d/%y %H:%M', 'data1.Startdate')) as TimeOff
from data1;
Но это дает мне все «нулевые» значения.
Если бы вы могли помочь мне с этим, я был бы очень признателен. Это вам так нравится!
Какая версия SQL? А что делает strftime()
? Какой тип данных он возвращает? Можете ли вы просто сделать date1.Enddate - date1.Startdate
, а затем применить форматирование к возвращаемому значению? Возвращают ли EndDate
и StartDate
значения до того, как вы попытаетесь их отформатировать?
SQLite поддерживает ограниченное количество форматов строки даты / времени, и ваши дата и время не соответствуют ни одному из них. Если вы хотите произвести какие-либо манипуляции с этими датами и временем в SQLite, вам нужно либо изменить способ их вставки, либо выполнить некоторые сложные манипуляции со строками.
Две возможные причины, по которым вы получили NULL
(вероятно, из-за скрытой ошибки):
1) Ваши даты имеют неправильный формат, когда вы их создаете. Вместо этого они должны быть в формате yyyy-mm-dd HH:MM:SS
.
2) Отсутствие закрывающей точки с запятой в одном из ваших запросов. Я вижу это в приведенном выше, но если тот, в который вы вставляете свои тестовые строки, не закрылся должным образом, вы можете не
Мой тестовый запрос:
https://dbfiddle.uk/?rdbms=sqlite_3.8&fiddle=8b9a168291bbc08c74a895ce22ab41ac
Настраивать
CREATE TABLE data1 (foo int, StartDate datetime, EndDate datetime) ;
INSERT INTO data1 (foo, StartDate, EndDate)
VALUES (1,'2018-03-15 16:00:00', '2018-03-28 17:00:00')
, (2,'2018-03-19 00:00:00', '2018-03-20 00:00:00') ;
Запрос
SELECT foo, StartDate, EndDate
, julianday(EndDate)-julianday(StartDate) AS TimeOffInDays
, CAST((julianday(EndDate) - julianday(StartDate))*24 AS real) AS TimeOffInHours
FROM data1 ;
Что дает нам ...
| foo | StartDate | EndDate | TimeOffInDays | TimeOffInHours |
=========================================================================================
| 1 | 2018-03-15 16:00:00 | 2018-03-28 17:00:00 | 13.041666666977 | 313.00000000745 |
| 2 | 2018-03-19 00:00:00 | 2018-03-20 00:00:00 | 1 | 24 |
Ваш текущий формат даты
%m/%d/%y
сделает это очень трудным. Пожалуйста, подумайте о том, чтобы записывать даты в формате год-месяц-день. Как только вы это сделаете, вы можете легко использоватьjulianday
, чтобы получить разницу между двумя временными метками.