Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
DateDiff (День, 0, GetDate ()) совпадает с DateDiff (День, '1900-01-01', GetDate ())
, Так как DateDiff возвращает целое число, Вы получите количество дней, которые протекли начиная с Jan 1, 1900. Вы тогда добавляете что целое число дней к Jan 1, 1900. Результирующий эффект удаляет компонент времени.
я должен также упомянуть, что этот метод работает на любую часть даты/времени (как год, четверть, месяц, день, час, минута, и второй).
Select DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select DateAdd(Second, DateDiff(Second, '20000101', GetDate()), '20000101')
последний, в течение многих секунд, требует специальной обработки. Если Вы будете использовать Jan 1, 1900 Вы получит ошибку.
Различие двух столбцов даты и времени вызвало переполнение во времени выполнения.
можно обойти эту ошибку при помощи различной ссылочной даты (как Jan 1, 2000).
Попробуйте динамическую ссылку на поле, в которой вы помещаете строку в круглые скобки, как показано на строке, определяющей материал .
S = struct('A', [1 2], 'B',[3 4 5]);
SNames = fieldnames(S);
for loopIndex = 1:numel(SNames)
stuff = S.(SNames{loopIndex})
end
Я согласен со Стивом и Адамом. Используйте клетки. Однако этот синтаксис подходит для людей в других ситуациях!
Здесь я хотел бы отметить три момента:
Причина, по которой вы получаете ошибку в приведенном выше коде, заключается в том, как вы индексируете SNames
. Функция fieldnames
возвращает массив ячеек строк, поэтому вам нужно использовать индексирование содержимого (т.е. фигурные скобки) для доступа к строковым значениям. Если вы измените четвертую строку вашего кода на это:
field = getfield (S, SNames {loopIndex});
then your code should work without error.
As suggested by MatlabDoug, you can use dynamic field names to avoid having to use getfield
(which yields cleaner looking code, in my opinion).
The suggestion from Adam to use a cell array instead of a structure is right on the mark. This is generally the best way to collect a series of arrays of different length into a single variable. Your code would end up looking something like this:
S = {[1 2], [3 4 5]}; % Create the cell array
for loopIndex = 1:numel(S) % Loop over the number of cells
array = S{loopIndex}; % Access the contents of each cell
% Do stuff with array
end
Подход getfield в порядке (хотя сейчас у меня нет доступной MATLAB, и это не ясно для мне, почему вышеуказанное не сработает).
Для альтернативной структуры данных вы также можете захотеть изучить массивы ячеек MATLAB. Они также позволят вам хранить и индексировать векторы различной длины.